Files
Cactidocumentation/General-Installing-Instructions.md
Thomas Vincent 57b8088e13 docs: comprehensive validation audit, Spine poller overhaul, and technical refactor (#229)
* docs: comprehensive audit, Spine poller overhaul, and technical refactor

- Overhaul Spine documentation (Spine.md) with complete end-to-end guide: architecture, prerequisites for modern distros (EL8/9 CRB, Ubuntu 22/24, Debian 11/12, FreeBSD), SUID root permissions, secure spine.conf setup (0640), Web UI configuration (Paths, Poller type, Data Collectors tuning), MySQL max_connections sizing, and troubleshooting.
- Fix broken links and anchors (Hardening, SNMP data queries, Hook API references).
- Fix broken image reference in Sites.md (add-site.JPG -> add-site.png).
- Fix syntax errors in documentation PHP code blocks, including invalid parenthesization, missing SQL execute quotes, and malformed comments in FAQ.
- Fix DevOps installation commands: use config.php.dist, correct systemctl service names for MySQL/MariaDB/PHP-FPM, remove nonexistent php-json, add missing composer install, and correct Debian/Ubuntu systemd environment path.
- Correct grammatical errors, repeated words, and typos across all markdown documents.
- Remove obsolete unreferenced duplicate installation guides.

Signed-off-by: Thomas Vincent <thomasvincent@gmail.com>

* docs: correct reviewed examples and guidance

Signed-off-by: Thomas Vincent <thomasvincent@gmail.com>

* docs: correct guidance that disagrees with the Cacti source

Verified each claim against include/global_arrays.php, lib/auth.php,
lib/functions.php, host_templates.php and the Spine config parser. The
notable ones: api_plugin_safe_exec() does not exist on either branch,
Spine reads DB_Pass rather than DB_Password, and the CDEF special data
source table was missing five entries and renamed four others.

Signed-off-by: Thomas Vincent <thomasvincent@gmail.com>

* docs: wrap Spine prose and fence the connection sizing formula

The formula's bare asterisks rendered as emphasis, dropping the multiplication signs.

Signed-off-by: Thomas Vincent <thomasvincent@gmail.com>

* chore: refresh copyright year in scripts and issue templates

Signed-off-by: Thomas Vincent <thomasvincent@gmail.com>

---------

Signed-off-by: Thomas Vincent <thomasvincent@gmail.com>
2026-09-08 09:41:21 -04:00

459 lines
13 KiB
Markdown

# General Installing Instructions
> **Note**: As of Cacti 1.2.31, PHP 8.1 is required and PHP Composer is
> required. Composer installs the vendor libraries and keeps them up to date.
Make sure the following packages are installed according to your operating
system's requirements. Verify that Apache and MySQL/MariaDB start at system
startup.
### A special note on installing Cacti in LXC containers such as those found on Proxmox
We recommend creating a privileged container. You may need to update your
container's config file with
```console
lxc.apparmor.profile: unconfined
```
This will allow ICMP ping and other functions to work.
A tested configuration file like the one below should work. Tune it to your own
needs and standards.
```console
arch: amd64
cores: 2
hostname: cacti
memory: 2048
net0: name=eth0,bridge=vmbr0,firewall=1,hwaddr=mac-id,ip=dhcp,type=veth
ostype: ubuntu
rootfs: local-lvm:vm-110-disk-0,size=8G
swap: 2048
lxc.apparmor.profile: unconfined
```
## Required Packages for Most Operating Systems
Depending on your operating system and PHP version, certain packages are
required for Cacti. The largest variable in these requirements comes with
regard to PHP and MySQL/MariaDB.
Installation requirements include the packages below. The installation of these
packages will vary by operating system.
### Base OS
- Apache, IIS, or nginx
- net-snmp, net-snmp-utils
- rrdtool
- help2man (for spine)
- dos2unix (for spine)
- development packages (gcc, automake, autoconf, libtool, either mysql-devel or
mariadb-devel, net-snmp-devel, help2man)
(for spine)
### Database
MySQL versions 8.0/8.4+ and MariaDB versions 10.5 through 11.x+ are supported.
- mysql
- mysql-server
- libmysqlclient
or
- mariadb
- mariadb-server
- libmariadbclient
### PHP Modules
The installation of these modules varies by OS. Use the `php -m` command to
verify that they are installed.
- posix
- session
- sockets
- PDO
- pdo_mysql
- xml
- ldap
- mbstring
- pcre
- json
- openssl
- gd
- zlib
### PHP Optional Modules
The following modules are optional, but preferred to be installed.
- snmp
- gmp (for plugin support)
- com or dotnet (Windows only)
### A special note for systems using PHP-FPM
Before starting the Cacti setup process, restart the PHP-FPM daemon to rebuild
its cache, or you may receive an HTTP 500 error.
```console
systemctl restart php-fpm
```
## FreeBSD
There are two ways to install on FreeBSD. In both cases Cacti pulls in its
dependent packages, so you do not need to install anything else. Each way has
trade-offs:
- Compiled packages: fast, but with fixed dependency versions (for example an
older MySQL server or PHP version).
```sh
pkg install cacti
pkg install spine
```
- FreeBSD ports: compilation can take a long time, but dependency versions are
not fixed (see
[Using the Ports Collection](https://docs.freebsd.org/en/books/handbook/ports/))
```sh
pkg install git
git clone https://git.FreeBSD.org/ports.git /usr/ports
git -C /usr/ports pull
# Choose either MariaDB or MySQL:
cd /usr/ports/databases/mariadb106-server
make install clean
cd /usr/ports/net-mgmt/cacti
make install
cd /usr/ports/net-mgmt/spine
make install
```
Apache and other software can be installed using packages or Ports as well.
Everything in FreeBSD is installed under /usr/local/. This documentation shows
paths such as /etc/php.ini and /usr/bin/spine.
Use the FreeBSD equivalents instead: /usr/local/etc, /usr/local/bin/spine.
For Spine, set the suid bit (without it, ICMP ping cannot function):
```sh
chmod +s /usr/local/bin/spine
```
## Configure PHP
Verify that the modules are installed and configured correctly. There are
several ways to do so - consult
[PHP configuration instructions](https://www.php.net/manual/en/configuration.php)
for a complete description.
It is imperative that you set the `date.timezone` in your `/etc/php.ini`, or
`/etc/phpX/apache/php.ini` and `/etc/phpX/cli/php.ini` files. Failure to do so
will result in errors after the install is complete.
Most other PHP configuration is done automatically by the base OS, so there is
no need to discuss that here.
## Configure the Webserver (Apache)
Most Linux and UNIX systems automatically configure the web server to allow PHP
content, so no additional configuration should be needed. The section below is
included for reference in case you are running a UNIX version that does not
configure the web server correctly. It is written specifically for RHEL and its
variants, so the instructions may vary.
Find the file `/etc/httpd/conf/httpd.conf` or its equivalent and make the
following changes to it:
```ini
# Load config files from the config directory "/etc/httpd/conf.d".
Include conf.d/*.conf
```
Now, locate the PHP configuration file at `/etc/httpd/conf.d/php.conf`
```ini
# PHP is an HTML-embedded scripting language which attempts to make it
# easy for developers to write dynamically generated webpages.
LoadModule php_module modules/libphp.so
#
# Cause the PHP interpreter to handle files with a .php extension.
AddHandler php-script .php
AddType text/html .php
#
# Add index.php to the list of files that will be served as directory
# indexes.
DirectoryIndex index.php
```
## Configure MySQL/MariaDB
Set a password for the root user, and record this password. If you lose control
of this password, you may have to re-install your database server in the case of
any system disaster or recovering from a crash.
```console
mysql_secure_installation
```
You must also load timezone information into the database. This is required for
various plugin use. Later, you will be required to grant access to the
`time_zone_name` table during the final installation steps.
```sh
shell> mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
```
Since Cacti 1.x is supporting internationalization (i18n), it is important that
the default character set for MySQL/MariaDB be i18n compatible. The Cacti
installer will make specific recommendations on MySQL/MariaDB settings. Follow
those as applicable for your OS.
Galera clustering: several tables use the MEMORY storage engine. Those tables
are not replicated among nodes, which can cause problems. If you configure Cacti
to connect to only one node of your cluster and are not load balancing, this
does not apply to you.
If you are running multiple nodes in a load-balanced environment where you
connect to a VIP, remove all but one node from rotation during Cacti
installation or update. After the installation or update, log in to your MySQL
server and run the following commands to convert those tables to the InnoDB
engine:
```sql
MariaDB [(none)]> use cacti;
MariaDB [cacti]> ALTER TABLE `automation_ips` ENGINE=InnoDB;
MariaDB [cacti]> ALTER TABLE `automation_processes` ENGINE=InnoDB;
MariaDB [cacti]> ALTER TABLE `data_source_stats_hourly_cache` ENGINE=InnoDB;
MariaDB [cacti]> ALTER TABLE `data_source_stats_hourly_last` ENGINE=InnoDB;
MariaDB [cacti]> ALTER TABLE `poller_output` ENGINE=InnoDB;
MariaDB [cacti]> ALTER TABLE `poller_output_boost_local_data_ids` ENGINE=InnoDB;
MariaDB [cacti]> ALTER TABLE `poller_output_boost_processes` ENGINE=InnoDB;
MariaDB [cacti]> ALTER TABLE `processes` ENGINE=InnoDB;
```
On Cacti 1.3 the `data_source_stats_hourly_cache` table already uses InnoDB,
so that one statement is a no-op there. It is still required on 1.2.x.
These changes should replicate to the other nodes in your cluster. Allow Cacti
to run at least two or three full polling cycles before placing the other nodes
back into rotation.
## Install and Configure Cacti
1. Extract the distribution tarball.
```sh
shell> tar xzvf cacti-version.tar.gz
```
2. Create the MySQL database:
```sh
shell> mysqladmin --user=root create cacti
```
3. Import the default cacti database:
```sh
shell> mysql cacti < cacti.sql
```
4. Optional: Create a MySQL username and password for Cacti.
```sql
shell> mysql --user=root mysql
mysql> CREATE USER 'cactiuser'@'localhost' IDENTIFIED BY 'somepassword';
mysql> GRANT ALL PRIVILEGES ON cacti.* TO 'cactiuser'@'localhost';
mysql> GRANT SELECT ON mysql.time_zone_name TO 'cactiuser'@'localhost';
mysql> FLUSH PRIVILEGES;
```
Note that if your `root` (or equivalent) user does not have `SUPER`
permissions, it may still be possible to `GRANT SELECT` privileges to the
Cacti user via an `INSERT INTO mysql.tables_priv`.
```sql
INSERT INTO mysql.tables_priv (Host, Db, User, Table_name, Grantor, Table_priv)
VALUES ('localhost', 'mysql', 'cactiuser', 'time_zone_name', 'root@localhost', 'Select');
```
5. Edit `include/config.php` and specify the database type, name, host, user and
password for your Cacti configuration.
```php
$database_type = "mysql";
$database_default = "cacti";
$database_hostname = "localhost";
$database_username = "cactiuser";
$database_password = "cacti";
```
6. Set the appropriate permissions on Cacti's directories for graph/log
generation. You should execute these commands from inside Cacti's directory
to change the permissions.
```sh
shell> chown -R cactiuser rra/ log/ cache/
```
(Enter a valid username for _cactiuser_, this user will also be used in the
next step for data gathering.)
7. Create your cron task file or systemd units file
Starting with Cacti 1.2.16, you have the option to use either the legacy
Crontab entry, or an optional cactid units file and server to run your Cacti
pollers.
For Crontab use, follow the instructions below:
Create and edit `/etc/cron.d/cacti` file. Make sure to setup the correct path
to poller.php
```console
*/5 * * * * apache php <path_cacti>/poller.php >/dev/null 2>&1
```
To install the systemd unit file, first edit the included unit file to match
your install location and the user and group the Cacti poller should run as.
Then follow the procedure below:
```console
vim <path_cacti>/service/cactid.service (edit the path)
touch /etc/sysconfig/cactid
cp -p <path_cacti>/service/cactid.service /etc/systemd/system
systemctl daemon-reload
systemctl enable cactid
systemctl start cactid
systemctl status cactid
```
The systemd units file makes managing a highly available Cacti setup a bit
more convenient.
8. During install, you will need to provide write access to the following files
and directories:
```sh
shell> chown -R apache:apache resource scripts include/config.php
```
Use the account your web server runs as. That is `apache` on Enterprise
Linux and `www-data` on Debian and Ubuntu. Do not use the database
account here, because it is a MySQL user rather than a system user.
Once the installation is complete, you may change the permissions to more
restrictive settings.
9. Point your web browser to:
`http://<your-server>/cacti/`
Log in with a username and password of _admin_. You will be required to
change this password immediately. Make sure to fill in all of the path
variables carefully and correctly on the following screen.
## (Optional) Install and Configure Spine
Spine is a very fast data collection engine, written in C. It is an optional
replacement for cmd.php. If you decide to use it, you will have to install it
explicitly. It does not come with Cacti itself.
The easiest way is to install Spine using rpm or ports. You will find packages
for Spine at the main Cacti site or from your distribution.
To compile Spine, download it to any location of your liking. Then, issue from
the downloaded directory following commands
```sh
shell> ./bootstrap
```
If the `bootstrap` script is successful, you then will follow the instructions it
provides to compile and install.
Assuming you installed Spine correctly, you must now configure it. The
configuration file may be placed in the same directory as Spine itself or at
/etc/spine.conf.
```ini
DB_Host 127.0.0.1 or hostname (not localhost)
DB_Database cacti
DB_User cactiuser
DB_Pass cactiuser
DB_Port 3306
```
### Considerations when using Proxies in front of Cacti (Cacti 1.2.23+)
For optimal security, specify only the HTTP headers that your proxy software
sets. This prevents unauthorized access through header spoofing. Set them by
editing the following section of `config.php`:
```php
/*
* Allow the use of Proxy IPs when searching for client
* IP to be used
*
* This can be set to one of the following:
* - false: to use only REMOTE_ADDR
* - true: to use all allowed headers (not advised)
* - array of one or more the following:
* 'X-Forwarded-For',
* 'X-Client-IP',
* 'X-Real-IP',
* 'X-ProxyUser-Ip',
* 'CF-Connecting-IP',
* 'True-Client-IP',
* 'HTTP_X_FORWARDED',
* 'HTTP_X_FORWARDED_FOR',
* 'HTTP_X_CLUSTER_CLIENT_IP',
* 'HTTP_FORWARDED_FOR',
* 'HTTP_FORWARDED',
* 'HTTP_CLIENT_IP',
*
* NOTE: The following will always be checked:
* 'REMOTE_ADDR',
*/
$proxy_headers = null;
```
---
Copyright (c) 2004-2026 The Cacti Group