On Debian 13:
sudo apt update
sudo apt install -y apache2 mariadb-server php php-cli php-mysql php-gd php-snmp php-ldap php-curl php-mbstring php-xml php-zip libsnmp-dev snmp snmpd librrds-perl rrdtool fping
On RHEL 10:
sudo dnf install -y epel-release
sudo dnf install -y httpd mariadb-server php php-cli php-mysqlnd php-gd php-snmp php-ldap php-curl php-mbstring php-xml php-zip net-snmp net-snmp-utils rrdtool fping
On Debian 13:
sudo systemctl enable --now mariadb
On RHEL 10:
sudo systemctl enable --now mariadb
Secure and create the database:
sudo mysql_secure_installation
sudo mysql -e "CREATE DATABASE cacti CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
sudo mysql -e "CREATE USER 'cactiuser'@'localhost' IDENTIFIED BY 'StrongPassword123!';"
sudo mysql -e "GRANT ALL PRIVILEGES ON cacti.* TO 'cactiuser'@'localhost';"
sudo mysql -e "FLUSH PRIVILEGES;"
Import timezone data:
sudo mysql mysql < /usr/share/mysql/mysql_test_data_timezone.sql
On Debian 13:
sudo apt install -y cacti
During installation, you’ll be prompted to:
On RHEL 10:
cd /tmp
curl -LO https://www.cacti.net/downloads/cacti-1.2.27.tar.gz
sudo tar -xzf cacti-1.2.27.tar.gz -C /var/www/html
sudo mv /var/www/html/cacti-1.2.27 /var/www/html/cacti
Set permissions:
sudo chown -R apache:apache /var/www/html/cacti
sudo chmod -R 755 /var/www/html/cacti
Create configuration:
sudo cp /var/www/html/cacti/include/config.php.dist /var/www/html/cacti/include/config.php
sudo nano /var/www/html/cacti/include/config.php
Set database credentials:
$database_type = 'mysql';
$database_default = 'cacti';
$database_hostname = 'localhost';
$database_username = 'cactiuser';
$database_password = 'StrongPassword123!';
$database_port = '3306';
$database_retries = 3;
$database_ssl = false;
On Debian 13 (automatic during install).
On RHEL 10:
sudo mysql cacti < /var/www/html/cacti/cacti.sql
Create cron user:
sudo mysql cacti -e "GRANT SELECT ON mysql.time_zone_name TO 'cactiuser'@'localhost';"
Edit Cacti configuration:
sudo nano /var/www/html/cacti/include/config.php
Ensure poller settings:
$poller_interval = 5;
Set up cron job:
sudo tee /etc/cron.d/cacti >/dev/null <<'EOF'
*/5 * * * * www-data php /var/www/html/cacti/poller.php > /dev/null 2>&1
EOF
On RHEL:
sudo tee /etc/cron.d/cacti >/dev/null <<'EOF'
*/5 * * * * apache php /var/www/html/cacti/poller.php > /dev/null 2>&1
EOF
Edit SNMP daemon config:
sudo tee /etc/snmp/snmpd.conf >/dev/null <<'EOF'
rocommunity public default
sysLocation Your Server Location
sysContact admin@example.com
EOF
Restart SNMP:
sudo systemctl enable --now snmpd
On Debian 13:
sudo systemctl restart apache2
On RHEL 10:
Create Apache config:
sudo tee /etc/httpd/conf.d/cacti.conf >/dev/null <<'EOF'
Alias /cacti /var/www/html/cacti
<Directory /var/www/html/cacti>
Require all granted
Options FollowSymLinks
AllowOverride All
</Directory>
EOF
sudo systemctl restart httpd
On UFW:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 161/udp
On firewalld:
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-port=161/udp
sudo firewall-cmd --reload
Open http://SERVER_IP/cacti and follow the installation wizard:
admin and your new passwordCacti will automatically collect:
See Cacti Hardening.
Setting up monitoring systems can be complex. We offer consulting services for:
Contact us at office@linux-server-admin.com or visit our contact page.
Prefer automation? See Cacti Ansible Setup for an example playbook.
Prefer containers? See Cacti Docker Setup.
See Cacti Configuration for configuration guidance.
See Cacti Security for hardening guidance.