Установка SuiteCRM на Rocky Linux 9 с Nginx и Let's Encrypt

SuiteCRM — открытое CRM‑решение на PHP. В этой инструкции показано пошагово, как развернуть SuiteCRM 8.x на Rocky Linux 9 с Nginx, PHP‑FPM, MySQL и сертификатом Let’s Encrypt. Приведены команды, права SELinux, настройка cron и советы по безопасности и отладке.
Короткое содержание
- Подготовка сервера и пакетов
- Установка Nginx, PHP 8.1 и MySQL
- Получение SSL‑сертификата через Certbot
- Развёртывание SuiteCRM и настройка SELinux
- Права, cron, советы по безопасности, альтернативы и чек‑листы для ролей
Требования
- Сервер с Rocky Linux 9.
- Пользователь с sudo‑привилегиями (не root).
- Полное доменное имя (FQDN), например
suitecrm.example.com. - Система обновлена:
$ sudo dnf update
- Установите набор утилит:
$ sudo dnf install wget curl nano unzip yum-utils policycoreutils-python-utils -y
Некоторые пакеты могут уже быть установлены.
Введение: что делает каждая часть стека
- Nginx — обратный прокси и статический веб‑сервер.
- PHP‑FPM — обработчик PHP‑скриптов; используем PHP 8.1.
- MySQL — база данных для SuiteCRM.
- Certbot/Let’s Encrypt — TLS для шифрования трафика.
- SELinux — обеспечивает безопасность доступа файлов и сетевых подключений; важно правильно настроить контексты.
Important: инструкция рассчитана на SuiteCRM 8.x; у 7.x путь к публичной директории был другим.
Шаг 1 — Настройка брандмауэра
Rocky Linux использует firewalld. Проверьте состояние:
$ sudo firewall-cmd --state
running
Посмотрите активные сервисы в зонах (по умолчанию — public):
$ sudo firewall-cmd --permanent --list-services
Откройте HTTP и HTTPS:
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
Примените изменения и проверьте ещё раз:
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --permanent --list-services
Ожидаемый результат включает http и https.
Шаг 2 — Установка Nginx
По умолчанию в Rocky Linux может быть старая версия Nginx. Подключите официальный репозиторий Nginx:
$ sudo nano /etc/yum.repos.d/nginx.repo
Вставьте:
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
Сохраните (Ctrl+X, Y).
Установите Nginx:
$ sudo dnf install -y nginx
Проверьте версию:
$ nginx -v
nginx version: nginx/1.24.0
Включите и запустите сервис:
$ sudo systemctl enable nginx --now
Проверьте статус:
$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled)
Drop-In: /usr/lib/systemd/system/nginx.service.d
??php-fpm.conf
Active: active (running) since Thu 2023-05-18 22:32:50 UTC; 4s ago
Docs: http://nginx.org/en/docs/
Process: 3955 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 3957 (nginx)
Tasks: 2 (limit: 5922)
Memory: 2.1M
CPU: 6ms
CGroup: /system.slice/nginx.service
??3957 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
??3958 "nginx: worker process"
Шаг 3 — Установка PHP и расширений
SuiteCRM 8 требует PHP 8.1. Добавьте EPEL и репозиторий Remi:
$ sudo dnf install epel-release -y
$ sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm
Посмотрите доступные потоки PHP (streams):
$ dnf module list php -y
Сбросьте модуль и включите PHP 8.1 из Remi:
$ sudo dnf module reset php -y
$ sudo dnf module enable php:remi-8.1
Установите PHP и нужные расширения для SuiteCRM:
$ sudo dnf install -y php-fpm php-mysql php-bcmath php-xml php-zip php-curl php-mbstring php-gd php-tidy php-intl php-cli php-opcache php-soap php-imap php-ldap
Проверьте версию PHP:
$ php --version
PHP 8.1.19 (cli) (built: May 10 2023 13:43:03) (NTS gcc x86_64)
Включите и запустите php-fpm:
$ sudo systemctl enable php-fpm --now
Шаг 4 — Установка MySQL
Установите MySQL:
$ sudo dnf install mysql-server
Проверьте версию:
$ mysql --version
mysql Ver 8.0.32 for Linux on x86_64 (Source distribution)
Включите и запустите MySQL:
$ sudo systemctl enable mysqld --now
Запустите скрипт безопасной настройки:
$ sudo mysql_secure_installation
При появлении запроса про Validate Password Component — рекомендую ответить “Y” и выбрать уровень 2 (STRONG). Далее установите пароль root и удалите анонимных пользователей, тестовую базу и отключите удалённый вход root.
Шаг 5 — Настройка базы данных для SuiteCRM
Войдите в MySQL и создайте базу и пользователя:
$ sudo mysql -u root -p
Внутри MySQL:
mysql> CREATE DATABASE suitecrm;
mysql> CREATE USER 'suiteuser'@'localhost' IDENTIFIED BY 'Your_password2';
mysql> GRANT ALL PRIVILEGES ON suitecrm.* TO 'suiteuser'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> exit
Замените ‘Your_password2’ на надёжный пароль, соответствующий политике.
Шаг 6 — Установка SSL (Certbot через snap)
Установим snapd и Certbot. EPEL уже был установлен ранее.
$ sudo dnf install -y snapd
$ sudo systemctl enable snapd --now
$ sudo snap install core && sudo snap refresh core
$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh
$ sudo snap install --classic certbot
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Проверьте версию:
$ certbot --version
certbot 2.6.0
Запросите сертификат для вашего домена (замените email и домен):
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d suitecrm.example.com
Сертификат появится в /etc/letsencrypt/live/suitecrm.example.com.
Создайте Diffie‑Hellman группу:
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Проверьте автоматическое обновление:
$ sudo systemctl list-timers
$ sudo certbot renew --dry-run
Important: убедитесь, что ваш домен указывает на сервер и порты 80/443 открыты.
Шаг 7 — Загрузка SuiteCRM
Создайте веб‑корень и скачайте архив SuiteCRM 8.x (ссылка с сайта SuiteCRM):
$ sudo mkdir /var/www/html/suitecrm -p
$ cd /var/www/html/suitecrm
$ sudo wget https://suitecrm.com/download/140/suite83/562304/suitecrm-8-3-0.zip
$ sudo unzip -q suitecrm*.*
$ sudo rm suitecrm-8-3-0.zip
Установите права и владельца (пользователь Nginx):
$ sudo find . -type d -not -perm 2755 -exec chmod 2755 {} \;
$ sudo find . -type f -not -perm 0644 -exec chmod 0644 {} \;
$ sudo find . ! -user nginx -exec chown nginx:nginx {} \;
$ sudo chmod +x bin/console
Примечание: команда chown проходит по всем файлам и назначает владельца nginx; проверьте, что это соответствует вашей политике безопасности.
Шаг 8 — Настройка SELinux
Пропишите корректный контекст для файлов SuiteCRM:
$ sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/suitecrm(/.*)?"
$ sudo restorecon -Rv /var/www/html/suitecrm/
Разрешите Nginx подключаться к базе данных и внешним сервисам (например, SMTP):
$ sudo setsebool -P httpd_can_network_connect_db 1
$ sudo setsebool -P httpd_can_network_connect 1
Note: semanage входит в пакет policycoreutils-python-utils; если его нет — установите.
Шаг 9 — Настройка Nginx и PHP
Настройка PHP‑FPM
Откройте /etc/php-fpm.d/www.conf и установите пользователя и группу для процессов PHP в nginx:
$ sudo nano /etc/php-fpm.d/www.conf
Найти и изменить на:
user = nginx
group = nginx
Затем раскомментируйте и укажите владельца сокета:
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
Закомментируйте listen.acl_users, если это необходимо:
;listen.acl_users = apache,nginx
Увеличьте max_execution_time и memory_limit, а также пределы загрузок файлов:
$ sudo sed -i 's/max_execution_time = 30/max_execution_time = 60/' /etc/php.ini
$ sudo sed -i 's/memory_limit = 128M/memory_limit = 256M/' /etc/php.ini
$ sudo sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 25M/g' /etc/php.ini
$ sudo sed -i 's/post_max_size = 8M/post_max_size = 25M/g' /etc/php.ini
Перезапустите php-fpm и измените группу каталога сессий:
$ sudo systemctl restart php-fpm
$ sudo chgrp -R nginx /var/lib/php/session
Настройка Nginx для SuiteCRM
Создайте конфигурацию сайта:
$ sudo nano /etc/nginx/conf.d/suitecrm.conf
Вставьте (замените suitecrm.example.com на ваш домен):
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name suitecrm.example.com;
root /var/www/html/suitecrm/public;
error_log /var/log/nginx/suitecrm.error.log;
access_log /var/log/nginx/suitecrm.access.log;
client_max_body_size 25M;
index index.php index.html index.htm;
ssl_certificate /etc/letsencrypt/live/suitecrm.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/suitecrm.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/suitecrm.example.com/chain.pem;
ssl_session_timeout 5m;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
location / {
try_files $uri /index.php;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_buffer_size 128k;
fastcgi_buffers 256 16k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}
# Don't log favicon
location = /favicon.ico {
log_not_found off;
access_log off;
}
# Deny all attempts to access hidden files/folders such as .htaccess, .htpasswd, .DS_Store (Mac), etc...
location ~ /\. {
deny all;
}
# A long browser cache lifetime can speed up repeat visits to your page
location ~* \.(jpg|jpeg|gif|png|webp|svg|woff|woff2|ttf|css|js|ico|xml)$ {
expires 360d;
}
}
# enforce HTTPS
server {
listen 80;
listen [::]:80;
server_name suitecrm.example.com;
return 301 https://$host$request_uri;
}
Обратите внимание: корневой каталог для SuiteCRM 8.x — /var/www/html/suitecrm/public.
Добавьте хэш для server_names перед включением conf.d, если нужно:
$ sudo nano /etc/nginx/nginx.conf
Добавьте строку перед include /etc/nginx/conf.d/*.conf;:
server_names_hash_bucket_size 64;
Проверьте конфигурацию и перезапустите Nginx:
$ sudo nginx -t
$ sudo systemctl restart nginx
Шаг 10 — Установка и вход в SuiteCRM
Есть два способа установки: через веб‑мастер или через консоль.
Вариант 1 — Веб‑мастер
Откройте https://suitecrm.example.com в браузере — должен появиться мастер установки.

Заполните URL, данные БД и администратора. Для хоста БД укажите localhost, порт 3306.

После установки войдите в панель администратора и настройте Email и другие интеграции через Admin → Email Settings.

Если у вас есть интеграции (Amazon SES, SMTP, Gmail, Exchange), настройте их в разделе Email Settings.

Для проверки отправки можно воспользоваться кнопкой Send Test Email.


Вариант 2 — Установка через консоль SuiteCRM
Перейдите в каталог SuiteCRM и выполните установку через bin/console:
$ cd /var/www/html/suitecrm
$ sudo ./bin/console suitecrm:app:install -u "admin_username" -p "admin_password" -U "db_user" -P "db_password" -H "localhost" -N "dbname" -S "https://suitecrm.example.com" -d "yes" -Z "3306"
Параметр -d "yes" добавляет демонстрационные данные; его можно опустить для чистой установки.
Также можно запустить установщик без параметров — он будет интерактивным:
$ sudo ./bin/console suitecrm:app:install
После успешной установки откройте https://suitecrm.example.com и войдите.
Шаг 11 — Настройка cron
SuiteCRM требует запуска cron каждую минуту. Отредактируйте crontab для пользователя nginx:
$ sudo EDITOR=nano crontab -e -u nginx
Добавьте строку:
* * * * * cd /var/www/html/suitecrm/public/legacy; php -f cron.php > /dev/null 2>&1
Сохраните. Проверьте логи cron, если задачи не выполняются.
Критерии приёмки
- Доступ к https://suitecrm.example.com открывается без ошибок TLS.
- Веб‑мастер SuiteCRM успешно прошёл все шаги и вы видите страницу логина.
- Cron‑задача выполняется каждую минуту (проверьте логи или обновления в интерфейсе).
- Email‑уведомления проходят (проверьте тестовое письмо).
- SELinux не блокирует записи в директории и сетевые подключения (проверка audit.log при проблемах).
Отладка: распространённые проблемы и решения
- Сертификат не выписывается: проверьте DNS и доступность порта 80.
- 502 Bad Gateway от Nginx: проверьте, запущен ли php‑fpm и совпадает ли сокет в конфигурации (обычно /run/php-fpm/www.sock).
- Проблемы с правами файлов: убедитесь, что nginx владеет файлами и что контекст SELinux выставлен httpd_sys_rw_content_t.
- Ошибка подключения к БД: проверьте правильность хоста, пользователя и пароля в мастере установки или в конфигурационных файлах.
Альтернативные подходы
- Apache вместо Nginx: если вы привыкли к Apache, можно использовать его с модулем php‑fpm. В этом случае меняются настройки виртуального хоста и SELinux контексты.
- Контейнеризация: запуск SuiteCRM в Docker/Kubernetes упрощает переносимость и изоляцию зависимостей.
- Панели управления (cPanel/ISPmanager): подходят для хостинга, где управление серверами выполняется через GUI.
Когда это может не подойти
- Если вы используете управляемый хостинг без доступа к root/sudo — этот метод неприменим.
- Маленькие инсталляции с низкими требованиями: возможно, проще использовать готовый SaaS‑CRM.
Руководство для ролей (чек‑лист)
Администратор сервера:
- Подготовить сервер с Rocky Linux 9.
- Настроить firewall и DNS для домена.
- Установить Nginx, PHP‑FPM, MySQL, snapd/Certbot.
- Настроить SELinux контексты и специальные boolean‑флаги.
DevOps инженер:
- Настроить systemd таймеры для резервного копирования и мониторинга.
- Обеспечить CI/CD для деплоймента (если нужно).
- Контролировать автоматическое обновление certbot.
Разработчик/администратор SuiteCRM:
- Запустить веб‑мастер или консольную установку.
- Настроить Email, интеграции и права пользователей.
- Настроить cron и проверить фоновые задачи.
Саппорт/операторы:
- Проверять логи Nginx, PHP‑FPM и MySQL.
- Проверять выполнение cron и очереди на отправку почты.
Безопасность и рекомендации
- Регулярно обновляйте систему и компоненты (DNF, PHP, Nginx, MySQL, SuiteCRM).
- Используйте сильные пароли и ограничения доступа к базе данных.
- Ограничьте SSH доступ по ключам и по IP, отключите вход по паролю.
- Делайте регулярные бэкапы базы и файлов, проверяйте процедуру восстановления.
- Включите автоматическое обновление certbot и тестируйте продление.
Короткий словарь
- FQDN — полное доменное имя (fully qualified domain name).
- PHP‑FPM — обработчик PHP‑скриптов, запускающийся как отдельный процесс.
- SELinux — подсистема безопасности, управляющая контекстами доступа.
- Certbot — клиент для автоматической генерации сертификатов Let’s Encrypt.
Мини‑плейбук: быстрое восстановление при ошибке 502
- Проверить статус php-fpm:
sudo systemctl status php-fpm. - Проверить сокет/порт в /etc/php-fpm.d/www.conf и в конфиге Nginx.
- Просмотреть логи Nginx (
/var/log/nginx/suitecrm.error.log) и PHP (/var/log/php-fpm/www-error.logесли есть). - Перезапустить службы:
sudo systemctl restart php-fpm && sudo systemctl restart nginx. - Если SELinux блокирует — посмотреть
sudo ausearch -m avc -ts recentи применить restorecon/semodule правила.
Решение: использовать веб‑мастер или консоль?
flowchart TD
A[У вас GUI‑доступ к серверу?] -->|Да| B[Веб‑мастер: откройте https://<домен>]
A -->|Нет| C[Используйте консольный установщик: bin/console]
B --> D[Следуйте шагам мастера]
C --> D
D --> E[Проверка: логин и cron]Тесты и критерии приёмки
- TLS: https://suitecrm.example.com открывается без предупреждений.
- Логин: можно выполнить вход под админом.
- Cron: в течение 5 минут появляются записи об успешном выполнении фоновых задач.
- Email: тестовое письмо приходит на указанный адрес.
Совместимость и миграция
- SuiteCRM 8.x использует публичную папку
public— при миграции с 7.x обновите корневой путь в конфигурации Nginx. - При переносе данных между версиями следуйте официальной документации по экспорту/импорту модулей и данных.
Заключение
Следуя шагам этой инструкции, вы получите работоспособный экземпляр SuiteCRM 8.x на Rocky Linux 9 с Nginx, PHP‑FPM, MySQL и TLS через Let’s Encrypt. Проверьте работу cron и отправку писем, настройте резервное копирование и мониторинг. При возникновении проблем используйте чек‑листы и плейбуки из этой статьи.
Если у вас остались вопросы — опишите точную ошибку, логи и вывод сервисов, и вы получите более точную помощь.
Похожие материалы
Понимание типографии — руководство для дизайнеров
Как вставить PDF в Microsoft Word
Сброс Windows 10/11 без потери файлов — как и когда
Беспроводная печать в Windows — советы и альтернативы
Отслеживание использования sudo в Linux