24IThub LLC Technical Deployment Guide
How to Install VICIdial on AlmaLinux 9
This step-by-step guide explains how to prepare an AlmaLinux 9 server for a VICIdial deployment, install the required database, web and telephony components, configure Asterisk, deploy the VICIdial application, create the first carrier and campaign, and validate the complete call flow.
The guide is intended for system administrators, telecom engineers, contact center operators and technical teams building a controlled lab or production dialer environment.
Production warning
Do not run installation commands blindly on an existing dialer. Take a complete server and database backup first. Test the complete procedure on a fresh AlmaLinux 9 server before using it in production.
Version policy
This guide uses Asterisk 18 as the reference telephony engine. Pin the exact Asterisk and VICIdial revisions validated by your organization instead of automatically deploying an untested release.
Deployment Architecture
Typical VICIdial Call Flow
Lead Database
→
VICIdial
→
Asterisk
→
SIP Carrier
→
Customer
→
Agent
Recommended Server Requirements
| Component | Lab / Small Setup | Production Recommendation |
|---|---|---|
| CPU | 4 vCPU | 8 or more dedicated CPU cores |
| Memory | 8 GB | 16 GB or more |
| Storage | 100 GB SSD | 500 GB or larger NVMe with recording plan |
| Operating System | AlmaLinux 9 minimal | Fresh AlmaLinux 9 minimal installation |
| Network | Static public IPv4 | Static IPv4 with stable low-latency connectivity |
| Hostname | Optional for lab | Dedicated FQDN |
| Backup | Manual | Automated off-server backup |
Pre-Installation Checklist
- ✓Fresh AlmaLinux 9 server
- ✓Root or sudo access
- ✓Static public IP address
- ✓Correct forward and reverse DNS where available
- ✓SIP carrier details
- ✓Approved caller ID
- ✓Firewall and RTP requirements
- ✓Recording retention plan
- ✓Database backup destination
Step 1: Confirm the Fresh Server
STEP 01
Verify operating system and resources
Confirm that the server is running AlmaLinux 9 and that its CPU, memory, storage, hostname and network configuration match the deployment plan.
root@dialer Copy Command
cat /etc/almalinux-release hostnamectl timedatectl ip address free -h df -h lscpu
Expected Result
AlmaLinux 9.x Correct hostname and timezone Expected public or private network address Sufficient RAM and free storage
Screenshot placement: Add a terminal screenshot showing the AlmaLinux version, hostname, memory and disk capacity.
Step 2: Configure Hostname and Timezone
STEP 02
Assign a permanent server identity
Replace the example hostname and timezone with values appropriate for your deployment.
root@dialer Copy Command
hostnamectl set-hostname dialer.example.com timedatectl set-timezone Asia/Kolkata timedatectl set-ntp true hostnamectl timedatectl
Expected Result
Static hostname: dialer.example.com Time zone: Asia/Kolkata System clock synchronized: yes
Use the correct timezone
VICIdial reports, scheduled callbacks, campaign operating hours and database timestamps depend on consistent time configuration.
Step 3: Update AlmaLinux
STEP 03
Install current operating-system updates
Update the package metadata and install available security and stability updates before adding application components.
root@dialer Copy Command
dnf clean all dnf makecache dnf update -y reboot
After Reboot
uname -r uptime timedatectl
Step 4: Enable Required Repositories
STEP 04
Enable build and supplementary packages
VICIdial and Asterisk require development libraries that may not all be available in a minimal installation.
root@dialer Copy Command
dnf install -y epel-release dnf config-manager --set-enabled crb dnf makecache
Verification
dnf repolist
Step 5: Install Core Packages
STEP 05
Install web, database, development and utility packages
Install the base packages needed for Apache, MariaDB, PHP, Asterisk compilation, source management and system administration.
root@dialer Copy Command
dnf groupinstall -y "Development Tools" dnf install -y \ git wget curl tar unzip rsync nano vim-enhanced \ httpd mariadb-server mariadb-devel \ php php-cli php-common php-mysqlnd php-gd php-mbstring \ php-xml php-process php-opcache php-json \ perl perl-CPAN perl-DBI perl-DBD-MySQL \ perl-Time-HiRes perl-libwww-perl perl-JSON \ openssl openssl-devel libxml2 libxml2-devel \ ncurses ncurses-devel libuuid libuuid-devel \ jansson jansson-devel sqlite sqlite-devel \ libedit libedit-devel libcurl libcurl-devel \ speex speex-devel speexdsp speexdsp-devel \ libogg libogg-devel libvorbis libvorbis-devel \ unixODBC unixODBC-devel sox lame ffmpeg \ chrony firewalld policycoreutils-python-utils
Verification
php -v httpd -v mariadb --version git --version sox --version
Package availability
Package names may vary between enabled repositories. If a package is unavailable, verify the repository configuration instead of installing an unrelated third-party RPM.
Step 6: Start Chrony, Firewall, Apache and MariaDB
STEP 06
Enable required services
Start the base services and configure them to launch automatically after a server reboot.
root@dialer Copy Command
systemctl enable --now chronyd systemctl enable --now firewalld systemctl enable --now mariadb systemctl enable --now httpd systemctl status chronyd --no-pager systemctl status mariadb --no-pager systemctl status httpd --no-pager
Expected Result
Active: active (running)
Step 7: Secure MariaDB
STEP 07
Apply the initial database security configuration
Remove test access, review anonymous users and configure the database administrator authentication according to your policy.
root@dialer Copy Command
mariadb-secure-installation
Verification
mariadb -e "SELECT VERSION();"
Step 8: Configure MariaDB for VICIdial
STEP 08
Create a dedicated database configuration file
Use a conservative baseline first. Database tuning should be based on actual call volume, list size, reporting load and available RAM.
root@dialer Copy Command
cat > /etc/my.cnf.d/vicidial.cnf <<'EOF' [mysqld] max_connections=500 max_allowed_packet=64M wait_timeout=300 interactive_timeout=300 skip_name_resolve=1 innodb_file_per_table=1 innodb_buffer_pool_size=2G innodb_log_file_size=512M innodb_flush_log_at_trx_commit=2 sql_mode=NO_ENGINE_SUBSTITUTION [client] default-character-set=utf8mb4 EOF systemctl restart mariadb systemctl status mariadb --no-pager
Verification
mariadb -e "SHOW VARIABLES LIKE 'max_connections';" mariadb -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
Adjust memory values
Do not use a 2 GB InnoDB buffer pool on a server that does not have sufficient RAM. Database, Apache, Asterisk and operating-system processes must all have adequate memory.
Step 9: Create the VICIdial Database and User
STEP 09
Create a dedicated application account
Replace the example password before executing the SQL.
root@dialer Copy Command
mariadb <<'SQL' CREATE DATABASE asterisk CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'cron'@'localhost' IDENTIFIED BY 'CHANGE_THIS_LONG_PASSWORD'; GRANT ALL PRIVILEGES ON asterisk.* TO 'cron'@'localhost'; FLUSH PRIVILEGES; SQL
Verification
mariadb -e "SHOW DATABASES;" mariadb -e "SELECT User,Host FROM mysql.user;"
Step 10: Download the VICIdial Source
STEP 10
Clone and pin the validated source revision
Use your approved VICIdial source repository and pin a tested commit or release before production deployment.
root@dialer Copy Command
mkdir -p /usr/src/vicidial cd /usr/src/vicidial git clone https://github.com/astguiclient/astguiclient.git cd astguiclient git status git log -1 --oneline
Production Requirement
Record the exact Git commit ID used for deployment. Do not automatically pull a different revision on production.
Step 11: Install Asterisk 18
STEP 11
Download and compile the validated Asterisk release
Replace the example version with the exact supported Asterisk 18 release validated for your VICIdial build.
root@dialer Copy Command
cd /usr/src export ASTERISK_VERSION="18.XX.X" wget "https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-${ASTERISK_VERSION}.tar.gz" tar -xzf "asterisk-${ASTERISK_VERSION}.tar.gz" cd "asterisk-${ASTERISK_VERSION}" contrib/scripts/install_prereq install ./configure --with-jansson-bundled --with-pjproject-bundled make menuselect
Menuselect Review
Confirm required codecs, format modules, res_http_websocket, PJSIP or chan_sip requirements, recording formats and app modules.
Do not continue with a placeholder version
Replace 18.XX.X with the exact Asterisk release tested by your team. A placeholder command should never be executed unchanged.
root@dialer Copy Command
make -j"$(nproc)" make install make samples make config ldconfig systemctl enable asterisk systemctl start asterisk asterisk -rx "core show version" asterisk -rx "core show uptime"
Expected Result
Asterisk 18.x System uptime displayed Asterisk process running successfully
Screenshot placement: Add the Asterisk CLI showing core show version and core show uptime.
Step 12: Create the Asterisk Service User and Permissions
STEP 12
Apply controlled ownership
Ensure Asterisk owns the directories it must write to without making the entire server world-writable.
root@dialer Copy Command
id asterisk || useradd --system --home-dir /var/lib/asterisk \ --shell /sbin/nologin asterisk chown -R asterisk:asterisk \ /etc/asterisk \ /var/lib/asterisk \ /var/log/asterisk \ /var/spool/asterisk \ /var/run/asterisk find /etc/asterisk -type d -exec chmod 750 {} \; find /etc/asterisk -type f -exec chmod 640 {} \;
Verification
ls -ld /etc/asterisk ls -ld /var/lib/asterisk ls -ld /var/spool/asterisk
Step 13: Deploy VICIdial Web Files
STEP 13
Copy the web interface to Apache
Confirm the actual source directories in your checked-out VICIdial revision before copying files.
root@dialer Copy Command
cd /usr/src/vicidial/astguiclient mkdir -p /var/www/html/vicidial mkdir -p /var/www/html/agc rsync -av www/vicidial/ /var/www/html/vicidial/ rsync -av www/agc/ /var/www/html/agc/ chown -R apache:apache /var/www/html/vicidial /var/www/html/agc find /var/www/html/vicidial -type d -exec chmod 755 {} \; find /var/www/html/vicidial -type f -exec chmod 644 {} \; find /var/www/html/agc -type d -exec chmod 755 {} \; find /var/www/html/agc -type f -exec chmod 644 {} \;
Verification
find /var/www/html/vicidial -maxdepth 2 -type f | head find /var/www/html/agc -maxdepth 2 -type f | head
Check source paths first
Different VICIdial source revisions may organize web files differently. Review the cloned repository before running the rsync commands.
Step 14: Install VICIdial Perl and AGI Files
STEP 14
Deploy backend scripts
Install the required VICIdial scripts, AGI programs and supporting files using the structure provided by the selected source revision.
root@dialer Copy Command
cd /usr/src/vicidial/astguiclient mkdir -p /usr/share/astguiclient mkdir -p /var/lib/asterisk/agi-bin rsync -av bin/ /usr/share/astguiclient/ rsync -av agi/ /var/lib/asterisk/agi-bin/ chown -R root:root /usr/share/astguiclient chown -R asterisk:asterisk /var/lib/asterisk/agi-bin find /usr/share/astguiclient -type f -exec chmod 750 {} \; find /var/lib/asterisk/agi-bin -type f -exec chmod 750 {} \;
Verification
ls -lah /usr/share/astguiclient | head ls -lah /var/lib/asterisk/agi-bin | head
Step 15: Import the VICIdial Database Schema
STEP 15
Locate and import the schema files
Inspect the SQL directory included with your source revision and import the required base schema and upgrade files in the documented order.
root@dialer Copy Command
cd /usr/src/vicidial/astguiclient find . -type f -name "*.sql" | sort
Next Action
Identify the base schema and required update scripts supplied by the pinned VICIdial revision. Import them in the documented order.
example-only Copy Command
mariadb asterisk < /path/to/validated-base-schema.sql mariadb -e "USE asterisk; SHOW TABLES;"
Expected Result
VICIdial tables should be listed. Do not use an arbitrary SQL file or skip required upgrade scripts.
Step 16: Configure astguiclient.conf
STEP 16
Connect VICIdial scripts to MariaDB
Locate the configuration template supplied with the source and enter the correct database host, database name, username and password.
root@dialer Copy Command
find /usr/src/vicidial/astguiclient \ -type f -name "astguiclient.conf*" -print nano /etc/astguiclient.conf
Required Values
VARDB_server: localhost VARDB_database: asterisk VARDB_user: cron VARDB_pass: your-secure-database-password VARSERVER_ip: server IP used by VICIdial
Protect database credentials
Restrict the configuration-file permissions and never publish real database passwords in screenshots, blogs or support tickets.
Step 17: Configure Apache
STEP 17
Create a dedicated virtual host
Replace the sample hostname with the production FQDN.
root@dialer Copy Command
cat > /etc/httpd/conf.d/vicidial.conf <<'EOF' <VirtualHost *:80> ServerName dialer.example.com DocumentRoot /var/www/html <Directory /var/www/html> AllowOverride All Require all granted Options FollowSymLinks </Directory> ErrorLog /var/log/httpd/vicidial-error.log CustomLog /var/log/httpd/vicidial-access.log combined </VirtualHost> EOF apachectl configtest systemctl restart httpd systemctl status httpd --no-pager
Expected Result
Syntax OK Apache active and running
Step 18: Configure PHP
STEP 18
Apply application limits
Review limits according to list-upload size, report generation and administrative workflows.
root@dialer Copy Command
cat > /etc/php.d/99-vicidial.ini <<'EOF' date.timezone = Asia/Kolkata memory_limit = 512M upload_max_filesize = 64M post_max_size = 64M max_execution_time = 300 max_input_time = 300 max_input_vars = 5000 session.gc_maxlifetime = 14400 EOF php --ini php -i | grep -E \ "date.timezone|memory_limit|upload_max_filesize|post_max_size" systemctl restart httpd
Verification
Configured timezone and limits should be displayed.
Step 19: Configure the Firewall
STEP 19
Allow only required traffic
Do not expose SIP and administrative services to the entire internet unless absolutely required. Prefer carrier IP allowlists, VPN access and trusted management networks.
| Service | Typical Port | Recommended Scope |
|---|---|---|
| HTTP | TCP 80 | Temporary or redirect to HTTPS |
| HTTPS | TCP 443 | Agents and administrators |
| SSH | TCP 22 | Trusted IP or VPN only |
| SIP | UDP/TCP 5060 or provider-defined | Carrier and approved endpoints only |
| RTP | Configured UDP range | Carrier and media endpoints |
example-policy Copy Command
firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https # Example only: replace with the RTP range configured in Asterisk. firewall-cmd --permanent --add-port=10000-20000/udp # Prefer a carrier source allowlist instead of opening SIP globally. firewall-cmd --permanent \ --add-rich-rule='rule family="ipv4" source address="CARRIER_IP/32" port protocol="udp" port="5060" accept' firewall-cmd --reload firewall-cmd --list-all
Security Requirement
Replace CARRIER_IP with the approved provider address. Match the RTP range to the active Asterisk configuration.
Step 20: Handle SELinux Correctly
STEP 20
Review denials instead of permanently disabling protection
Keep SELinux enforcing where possible. Apply only the permissions required by the application and inspect audit logs when access is denied.
root@dialer Copy Command
getenforce restorecon -Rv /var/www/html restorecon -Rv /var/lib/asterisk restorecon -Rv /var/spool/asterisk setsebool -P httpd_can_network_connect_db 1 setsebool -P httpd_can_network_connect 1 ausearch -m AVC -ts recent | tail -50
Expected Result
Review AVC denials and create narrowly scoped policy adjustments only when a legitimate application action is blocked.
Step 21: Install VICIdial Cron Jobs
STEP 21
Use the cron template supplied by the pinned source
Cron jobs manage dialing processes, reports, recordings, maintenance and several background workflows.
root@dialer Copy Command
cd /usr/src/vicidial/astguiclient find . -type f | grep -Ei \ "cron|crontab|ADMIN_keepalive|AST_manager" crontab -l
Deployment Rule
Install the official cron template supplied by your validated VICIdial revision. Review every path before enabling it.
Do not paste an unrelated crontab
Cron entries differ by VICIdial release, server role and deployment architecture. Use the template included with the exact source revision.
Step 22: Configure Asterisk Manager Access
STEP 22
Create a restricted AMI account
VICIdial communicates with Asterisk through the Asterisk Manager Interface. Use a dedicated account and restrict its network scope.
configuration-example Copy Command
cat >> /etc/asterisk/manager.conf <<'EOF' [vicidial] secret = CHANGE_THIS_AMI_PASSWORD deny = 0.0.0.0/0.0.0.0 permit = 127.0.0.1/255.255.255.255 read = all write = all EOF chown asterisk:asterisk /etc/asterisk/manager.conf chmod 640 /etc/asterisk/manager.conf asterisk -rx "manager reload" asterisk -rx "manager show users"
Expected Result
Dedicated VICIdial AMI account visible. Remote access blocked unless explicitly required.
Step 23: Restart and Verify Core Services
STEP 23
Confirm all primary services
Restart the application stack and review each service before attempting the first browser login.
root@dialer Copy Command
systemctl restart mariadb systemctl restart httpd systemctl restart asterisk systemctl status mariadb --no-pager systemctl status httpd --no-pager systemctl status asterisk --no-pager asterisk -rx "core show version" asterisk -rx "core show channels" asterisk -rx "manager show users" mariadb -e "USE asterisk; SHOW TABLES;" | head
Expected Result
MariaDB active Apache active Asterisk active VICIdial database tables present AMI account present
Step 24: Open the VICIdial Administration Portal
STEP 24
Confirm browser access
Open the administration URL using the configured hostname. Immediately replace any default credentials and restrict administrative access.
browser Copy Command
http://dialer.example.com/vicidial/admin.php
After Login
Change default administrator credentials. Create named administrator accounts. Review system settings and server definitions.
Screenshot placement: Add the VICIdial administrator login page with server details and sensitive information hidden.
Step 25: Add the VICIdial Server
STEP 25
Register the local Asterisk server
In the administrator interface, add or verify the server record. Match the server IP, active status, Asterisk version, recording paths and manager credentials.
| Field | Recommended Value |
|---|---|
| Server ID | Unique short identifier |
| Server IP | IP used by VICIdial services |
| Active | Y after verification |
| Asterisk Version | Installed Asterisk 18 release |
| Manager User | Dedicated AMI account |
| Recording Location | Approved storage path |
Step 26: Configure the SIP Carrier
STEP 26
Add carrier signaling and dial rules
Use the exact authentication, codec, destination format and caller ID requirements supplied by the voice provider.
| Carrier Item | Required Information |
|---|---|
| Authentication | IP authentication or registration |
| SIP Host | Carrier SBC or proxy |
| Signaling Port | Provider-defined SIP port |
| Codec | Provider-supported audio codec |
| Destination Format | E.164 or provider-defined format |
| Caller ID | Carrier-approved CLI |
| RTP Range | Must match firewall configuration |
Do not publish carrier credentials
Blur SIP usernames, passwords, customer prefixes, account IDs, telephone numbers and provider IP details in screenshots.
Step 27: Create Phones and Agent Users
STEP 27
Provision agent access
Create phone records, agent users and user groups. Assign the minimum permissions required for each role.
| Object | Purpose |
|---|---|
| Phone | Links an extension or softphone to Asterisk |
| User | Provides agent or administrator authentication |
| User Group | Controls permissions and campaign access |
| Remote Agent | Optional remote telephone workflow |
Screenshot placement: Add the Phone, User and User Group screens with all passwords hidden.
Step 28: Create the First Campaign
STEP 28
Start with a controlled manual or ratio campaign
Avoid aggressive predictive settings until carrier performance, agent workflow and reporting have been validated.
| Campaign Setting | Initial Recommendation |
|---|---|
| Campaign ID | Short unique code |
| Campaign Name | Descriptive business name |
| Active | N during configuration, Y after testing |
| Dial Method | Manual, Ratio or controlled Progressive |
| Local Call Time | Approved customer calling window |
| Caller ID | Carrier-approved CLI |
| Recording | Configure according to consent and policy |
| Statuses | Use clear business dispositions |
Step 29: Create a List and Upload Test Leads
STEP 29
Use internal test numbers first
Create a small test list containing only approved internal or controlled destination numbers.
| CSV Field | Example |
|---|---|
| phone_number | Validated test number |
| first_name | Test |
| last_name | Customer |
| country_code | Destination country code |
| comments | Internal controlled test |
Do not start with production data
Validate dialing, audio, caller ID, dispositions, recordings and reporting using a controlled test list before importing customer data.
Step 30: Test Agent Login
STEP 30
Validate the complete agent workflow
Confirm that the phone registers, the agent logs in, the campaign is available and customer data appears correctly.
Agent Login Checklist
- ✓Softphone or browser phone registers
- ✓Agent login page opens
- ✓Phone login succeeds
- ✓User login succeeds
- ✓Campaign appears
- ✓Agent becomes ready
- ✓Customer data loads
- ✓Pause codes work
- ✓Disposition saves correctly
Step 31: Place a Controlled Test Call
STEP 31
Validate signaling, audio and reporting
Place a test call to an approved destination while monitoring the Asterisk CLI and carrier response.
asterisk-cli Copy Command
asterisk -rvvvvv core show channels pjsip show endpoints pjsip show registrations # For chan_sip environments: sip show peers sip show registry
Validate
Correct destination format Expected caller ID Two-way audio Correct disposition Recording generated Call visible in reports
Step 32: Verify Recordings
STEP 32
Confirm storage and playback
Verify that recording files are created, permissions are correct, playback works and retention requirements are documented.
root@dialer Copy Command
find /var/spool/asterisk/monitor -type f | tail -20 du -sh /var/spool/asterisk/monitor df -h
Expected Result
New recording file present File ownership valid Disk capacity sufficient Recording accessible only to authorized users
Step 33: Verify VICIdial Background Processes
STEP 33
Confirm keepalive and scheduled processes
Review the running VICIdial scripts and verify that cron jobs are launching the expected processes.
root@dialer Copy Command
ps aux | grep -Ei \ "AST_|VD|vicidial|astguiclient" | grep -v grep crontab -l journalctl -u crond --since "30 minutes ago" --no-pager
Expected Result
Required VICIdial processes running Cron entries present No repeated path, permission or database errors
Step 34: Configure HTTPS
STEP 34
Protect administrator and agent credentials
Configure a valid TLS certificate and redirect browser traffic from HTTP to HTTPS.
root@dialer Copy Command
dnf install -y certbot python3-certbot-apache certbot --apache -d dialer.example.com certbot renew --dry-run
Expected Result
Valid HTTPS certificate installed HTTP redirected to HTTPS Certificate renewal test successful
Step 35: Configure Backups
STEP 35
Back up the database and critical configuration
Store backups outside the dialer server and regularly test the restoration procedure.
backup-example Copy Command
mkdir -p /backup/vicidial mariadb-dump \ --single-transaction \ --routines \ --triggers \ asterisk \ | gzip > "/backup/vicidial/asterisk-$(date +%F-%H%M).sql.gz" tar -czf \ "/backup/vicidial/config-$(date +%F-%H%M).tar.gz" \ /etc/asterisk \ /etc/astguiclient.conf \ /etc/httpd/conf.d/vicidial.conf \ /etc/my.cnf.d/vicidial.cnf
Verification
ls -lh /backup/vicidial gzip -t /backup/vicidial/asterisk-*.sql.gz
A local backup is not sufficient
Copy encrypted backups to a separate server or approved storage platform. A disk failure or security incident can destroy local backups stored on the same system.
Step 36: Production Security Checklist
Security Hardening
- ✓Default VICIdial accounts removed or changed
- ✓Named administrator accounts created
- ✓Strong database and AMI passwords configured
- ✓SSH restricted to trusted IP or VPN
- ✓SIP restricted to approved sources where possible
- ✓HTTPS enabled
- ✓SELinux denials reviewed
- ✓Firewall rules documented
- ✓Recordings protected by role
- ✓Off-server backups tested
- ✓Logs monitored
- ✓Calling and privacy policies implemented
Step 37: Production Readiness Test
Final Go-Live Checklist
- ✓AlmaLinux fully updated
- ✓MariaDB active and backed up
- ✓Apache and HTTPS working
- ✓Asterisk active
- ✓VICIdial processes running
- ✓SIP carrier connected
- ✓Approved caller ID displayed
- ✓Two-way audio tested
- ✓Agent login tested
- ✓Campaign and list tested
- ✓Disposition saved
- ✓Recording generated
- ✓Reports show correct result
- ✓Monitoring and disk alerts configured
Common VICIdial Installation Problems
| Problem | Likely Cause | Recommended Check |
|---|---|---|
| Admin page does not open | Apache, PHP, firewall or file path | Check httpd status and error log |
| Database connection fails | Wrong credentials or MariaDB permission | Test the account from the command line |
| Asterisk does not start | Configuration or module error | Run Asterisk in console mode and inspect logs |
| Carrier does not register | Authentication, DNS or signaling issue | Review SIP registration and carrier requirements |
| One-way audio | NAT or RTP firewall problem | Verify external address, local networks and RTP range |
| Agent cannot log in | Phone, user, campaign or permissions issue | Review user, phone and campaign assignments |
| Campaign does not dial | Inactive list, no leads, time restriction or process issue | Check campaign, list, leads and background processes |
| Recordings are missing | Recording disabled, path issue or no storage | Check campaign setting, permissions and disk capacity |
| Reports show incorrect time | Timezone mismatch | Compare OS, PHP, MariaDB and VICIdial time settings |
| Web page returns permission denied | SELinux context or Apache permissions | Review AVC and Apache logs |
Useful Diagnostic Commands
diagnostics Copy Command
systemctl status mariadb --no-pager systemctl status httpd --no-pager systemctl status asterisk --no-pager systemctl status firewalld --no-pager journalctl -u mariadb -n 100 --no-pager journalctl -u httpd -n 100 --no-pager journalctl -u asterisk -n 100 --no-pager tail -100 /var/log/httpd/error_log tail -100 /var/log/asterisk/full asterisk -rx "core show channels" asterisk -rx "core show uptime" asterisk -rx "manager show users" mariadb -e "SHOW PROCESSLIST;" df -h free -h ss -lntup
Use
Run these commands when checking service state, ports, database activity, Asterisk channels, logs and server resources.
Recommended Screenshots for This Guide
| Screenshot | Placement |
|---|---|
| AlmaLinux server verification | After Step 1 |
| Repository and package installation | After Step 5 |
| MariaDB service status | After Step 8 |
| Asterisk version and uptime | After Step 11 |
| VICIdial admin login | After Step 24 |
| Server configuration page | After Step 25 |
| Carrier configuration | After Step 26 |
| User and phone setup | After Step 27 |
| Campaign setup | After Step 28 |
| Lead upload | After Step 29 |
| Agent interface | After Step 30 |
| Live call monitoring | After Step 31 |
| Recording and reports | After Step 32 |
Frequently Asked Questions
Can VICIdial run on AlmaLinux 9?
Yes, it can be deployed on AlmaLinux 9 when its database, web, Perl and Asterisk dependencies are prepared correctly. Organizations should test and pin the complete software stack before production use.
Which Asterisk version should be used?
Use the exact Asterisk release tested with your selected VICIdial revision. This guide uses Asterisk 18 as the reference platform, but the production version should be pinned and documented.
Should SELinux be disabled?
Permanently disabling SELinux is not the preferred production approach. Keep it enforcing where practical, correct file contexts and review AVC denials when the application requires additional access.
Why is a static public IP required?
A predictable address simplifies carrier authentication, firewall rules, remote access, NAT configuration and SIP media handling.
Why does one-way audio occur?
Common causes include incorrect NAT settings, blocked RTP traffic, mismatched media ranges, carrier restrictions or an incorrect external address.
Can the database be hosted on another server?
Yes. Larger deployments may separate the database, web and telephony roles. The architecture must include secure connectivity, low latency, backups and appropriate database permissions.
Can agents work remotely?
Yes, but remote access should use secure network controls, approved endpoints, strong authentication and voice-quality monitoring.
How much storage is required for recordings?
Storage depends on codec, call volume, average call duration, retention period and whether recordings are compressed or archived. Monitor actual daily growth before finalizing capacity.
Can VICIdial use IP-authenticated SIP trunks?
Yes. The carrier may authenticate using the dialer's public IP instead of SIP registration. Firewall and source-address restrictions should match the provider's requirements.
When should predictive dialing be enabled?
Enable predictive dialing only after the carrier, call progress, agent availability, abandoned-call controls and reporting have been validated. Start with a controlled dialing mode during initial testing.
Final Recommendation
A successful VICIdial deployment requires more than installing packages. The database, Asterisk, carrier routing, firewall, web portal, cron processes, recordings, campaigns, agents and reporting must operate as one controlled system.
Always begin with approved internal test numbers. Confirm two-way audio, caller ID, agent workflow, recording, dispositions and reports before introducing production customer data or increasing the dialing ratio.
24IThub LLC provides Cloud Dialer, VICIdial deployment, Hosted PBX, SIP Trunking, Virtual Numbers, Toll-Free Numbers and enterprise voice-infrastructure solutions for contact centers, sales teams and customer support operations.