ISPConfig - бесплатная панель управления хостингом с открытым исходным кодом c возможностью управлять несколькими серверами из одной панели управления. Это один из лучших вариантов для веб-студий, хостинг-компаний, а так же для всех, кто ищет бесплатную панель управления хостингом с широким функционалом.
В сети есть инструкции по установке на OpenSuSe, Fedora, CentOS, Debian и Ubuntu разных версий, с выходом новой ОС из поддерживаемых инструкции обновляют, но инструкция под ubuntu 20.04 с nginx почему-то выпала из числа обновленных. Самое время это исправить.
Убедимся, что наша ОС сконфигурирована
Убедимся, что на нашем сервере установлены последние версии всех пакетов, установлен ssh клиент и vim (или любой другой текстовый редактор, в котором вам будет удобно работать), настроен статичный ip, hosts, hostname и локали.
Для установки обновлений, ssh и текстового редактора выполним команды:
sudo -s
apt update && apt upgrade -y && apt autoremove -y && apt install -y ssh openssh-server nano vim-nox
Настроим статичный ip, для этого откроем файл конфигурации и укажем необходимые настройки:
vi /etc/netplan/00-installer-config.yaml
/etc/netplan/00-installer-config.yaml
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: no
addresses: [185.104.112.249/24]
gateway4: 185.104.112.1
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
Проверим корректность конфигурации командой
netplan try
В случае если все хорошо и конфигурация верна, появится надпись с предложением применить конфигурацию, для применения необходимо нажать клавишу ENTER, если в течении 120 секунд мы не согласимся - будет использована предыдущая конфигурация:
netplan try
root@host:~# netplan try
Warning: Stopping systemd-networkd.service, but it can still be activated by:
systemd-networkd.socket
Do you want to keep these settings?
Press ENTER before the timeout to accept the new configuration
Changes will revert in 116 seconds
Также применить конфигурацию можно с помощью команды
netplan apply
Откроем файл hosts командой
vi /etc/hosts
и убедимся в наличии строки указывающей на наш сервер, как по имени хоста, так по имени хоста и домену (ispnginx - имя хоста, сat-a.ru - домена):
/etc/hosts
127.0.0.1 localhost.localdomain localhost
185.104.112.249 ispnginx.cat-a.ru ispnginx
::1 localhost6.localdomain6 localhost6
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
Установим хостнейм, выполнив команды:
echo ispnginx > /etc/hostname && hostname ispnginx
или
hostnamectl set-hostname ispnginx
Проверим, изменился ли hostname командами:
hostname
hostname -f
Вывод должен выглядеть примерно так
root@host:~# hostname
ispnginx
root@host:~# hostname -f
ispnginx.cat-a.ru
Настроим локали, выполнив:
dpkg-reconfigure locales
Выбираем для установки en_US.UTF-8 и ru_RU.UTF-8, после чего перезагрузим сервер - он предварительно подготовлен к установке Ispconfig
Изменим оболочку по умолчанию
В настоящий момент /bin/sh - симлинк /bin/dash, но нам нужно /bin/bash, выполним:
dpkg-reconfigure dash
В открывшемся окне выбираем "No"
Выключим и удалим apparmor
service apparmor stop && update-rc.d -f apparmor remove && apt-get remove apparmor apparmor-utils
Установим ntp
apt install -y ntp ntpdate
Установим Postfix, Dovecot, MySQL, phpMyAdmin, rkhunter, Binutils
Установим Postfix, Dovecot, MySQL, rkhunter и binutils с помошью команды:
apt install -y postfix postfix-mysql postfix-doc mysql-client mysql-server openssl getmail4 rkhunter binutils dovecot-imapd dovecot-pop3d dovecot-mysql dovecot-sieve dovecot-lmtpd sudo patch
Когда установщик попросит указать какую почтовый конфигурацию выбрать указываем Internet Site, в качестве System mail name указываем hostname
General type of mail configuration: <-- Internet Site
System mail name: <-- server1.example.com
Откроем TLS/SSL и submission порты в Postfix, для этого откроем файл /etc/postfix/master.cf
vi /etc/postfix/master.cf
и раскомментируем секции submission, smtps, а также по первые 3 строчки в каждой секции и добавим к обеим секциям строку (не забываем 2 пробела в начале строки):
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
/etc/postfix/master.cf должен выглядеть так:
smtp inet n - y - - smtpd
#smtp inet n - y - 1 postscreen
#smtpd pass - - y - - smtpd
#dnsblog unix - - y - 0 dnsblog
#tlsproxy unix - - y - 0 tlsproxy
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o smtpd_tls_auth_only=yes
# -o smtpd_reject_unlisted_recipient=no
# -o smtpd_client_restrictions=$mua_client_restrictions
# -o smtpd_helo_restrictions=$mua_helo_restrictions
# -o smtpd_sender_restrictions=$mua_sender_restrictions
# -o smtpd_recipient_restrictions=
# -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o smtpd_reject_unlisted_recipient=no
# -o smtpd_client_restrictions=$mua_client_restrictions
# -o smtpd_helo_restrictions=$mua_helo_restrictions
# -o smtpd_sender_restrictions=$mua_sender_restrictions
# -o smtpd_recipient_restrictions=
# -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
Выполним перезагрузку postfix
service postfix restart
Чтобы базы данных были доступны удалено отредактируем файл /etc/mysql/mysql.conf.d/mysqld.cnf и закомментируем стоки:
bind-address = 127.0.0.1
mysqlx-bind-address = 127.0.0.1
Ниже добавим строку:
mysqlx=OFF
vi /etc/mysql/mysql.conf.d/mysqld.cnf
/etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
#
# * Basic Settings
#
user = mysql
# pid-file = /var/run/mysqld/mysqld.pid
# socket = /var/run/mysqld/mysqld.sock
# port = 3306
# datadir = /var/lib/mysql
# If MySQL is running as a replication slave, this should be
# changed. Ref https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_tmpdir
# tmpdir = /tmp
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address = 127.0.0.1
#mysqlx-bind-address = 127.0.0.1
mysqlx=OFF
Перезапустим mysql и проверим, что сетевой доступ к mysql включен командой:
service mysql restart && netstat -tap | grep mysql
Вывод должен быть аналогичен данному:
root@ispnginx:~# netstat -tap | grep mysql
tcp6 0 0 [::]:mysql [::]:* LISTEN 18513/mysqld
root@ispnginx:~#
Установим Amavisd-new, SpamAssassin, and Clamav
Выполним установку командой:
apt install -y amavisd-new spamassassin clamav clamav-daemon unzip bzip2 arj nomarch lzop cabextract apt-listchanges libnet-ldap-perl libauthen-sasl-perl clamav-docs daemon libio-string-perl libio-socket-ssl-perl libnet-ident-perl zip libnet-dns-perl postgrey
т.к. amavisd, загружает фильтры SpamAssassin, мы можем остановить SpamAssassin для экономии памяти
service spamassassin stop
update-rc.d -f spamassassin remove
Запустим ClamAV
freshclam
service clamav-daemon start
Ошибку при первом запуске игнорируем
root@ispnginx:~# service spamassassin stop
root@ispnginx:~# update-rc.d -f spamassassin remove
root@ispnginx:~# freshclam
WARNING: Ignoring deprecated option SafeBrowsing at /etc/clamav/freshclam.conf:22
ERROR: /var/log/clamav/freshclam.log is locked by another process
ERROR: Problem with internal logger (UpdateLogFile = /var/log/clamav/freshclam.log).
ERROR: initialize: libfreshclam init failed.
ERROR: Initialization error!
root@ispnginx:~# service clamav-daemon start
root@ispnginx:~#
Установим Nginx, PHP 7.4 (PHP-FPM), and Fcgiwrap
Установим nginx
apt-get install nginx
Обращаться к интерпретатору мы будем через PHP-FPM (FastCGI Process Manager), установим его:
apt-get -y install php7.4-fpm
Поищем дополнительные модули php:
apt-cache search php7.4
Выберем необходимые и установим:
apt install -y php7.4-common php7.4 php7.4-gd php7.4-mysql php7.4-imap php7.4-cli php7.4-cgi php7.4-curl php7.4-pspell php7.4-intl php7.4-sqlite3 php7.4-tidy php7.4-xml php7.4-xmlrpc php7.4-zip php7.4-xsl php7.4-mbstring php7.4-soap php-pear mcrypt imagemagick libruby memcached php-memcache php-imagick php-soap php-apcu
Откроем файл
vi /etc/php/7.4/fpm/php.ini
И установим cgi.fix_pathinfo=0, your timezone, short_open_tag= On
/etc/php/7.4/fpm/php.ini
[...]
cgi.fix_pathinfo=0
[...]
date.timezone="Europe/Moscow"
[...]
short_open_tag = On
[...]
Перезагрузим PHP-FPM:
service php7.4-fpm reload
Чтобы получить поддержку CGI в nginx, установим Fcgiwrap:
apt-get -y install fcgiwrap
Установим phpmyadmin
apt-get -y install phpmyadmin php-mbstring
В процессе установщик спросит под какой сервер сконфигурировать pma, но из вариантов только apache и lighthttpd, потому ничего не выбираем :
Также просто пропускаем вопрос об установке пароля MySQL application password for phpmyadmin: <-- Press Enter
Далее соглашаемся
Configure database for phpmyadmin with dbconfig-common? <-- Yes
Установим Let's Encrypt, PureFTPd и Quota
apt install -y certbot pure-ftpd-common pure-ftpd-mysql quota quotatool
Отредактируем файл /etc/default/pure-ftpd-common и убедимся, что start mode = standalone и VIRTUALCHROOT=true
vi /etc/default/pure-ftpd-common
Включим FTPS командой
echo 1 > /etc/pure-ftpd/conf/TLS
Создадим директорию для сертификатов
mkdir -p /etc/ssl/private/
И сегнерируем сам SSL сертификат
openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem
Поменяем права на файл:
chmod 600 /etc/ssl/private/pure-ftpd.pem
Перезапустим PureFTPd:
service pure-ftpd-mysql restart
Отредактируем файл /etc/fstab. Мой выглядит примерно так (добавляем ,usrjquota=quota.user,grpjquota=quota.group,jqfmt=vfsv0 к корневой точке монтирования):
vi /etc/fstab
/etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/vda1 during curtin installation
/dev/disk/by-uuid/1ea0d83c-2954-45aa-9e4d-3a80d5fa031f / ext4 defaults,usrjquota=quota.user,grpjquota=quota.group,jqfmt=vfsv0 0 0
/swap.img none swap sw 0 0
Включаем quota:
mount -o remount /
quotacheck -avugm
quotaon -avug
quota
root@ispnginx:~# mount -o remount
quotacheck -avugm
quotacheck: Scanning /dev/vda1 [/] done
quotacheck: Cannot stat old user quota file //quota.user: No such file or directory. Usage will not be subtracted.
quotacheck: Cannot stat old group quota file //quota.group: No such file or directory. Usage will not be subtracted.
quotacheck: Cannot stat old user quota file //quota.user: No such file or directory. Usage will not be subtracted.
quotacheck: Cannot stat old group quota file //quota.group: No such file or directory. Usage will not be subtracted.
quotacheck: Checked 13965 directories and 88306 files
quotacheck: Old file not found.
quotacheck: Old file not found.
root@ispnginx:~# quotaon -avug
/dev/vda1 [/]: group quotas turned on
/dev/vda1 [/]: user quotas turned on
Установим Vlogger, Webalizer, AWStats and GoAccess
apt install -y vlogger webalizer awstats geoip-database libclass-dbi-mysql-perl
Установим последнюю версию GoAccess из репозитория разработчика:
echo "deb https://deb.goaccess.io/ $(lsb_release -cs) main" | tee -a /etc/apt/sources.list.d/goaccess.list
wget -O - https://deb.goaccess.io/gnugpg.key | apt-key --keyring /etc/apt/trusted.gpg.d/goaccess.gpg add -
apt update
apt install goaccess
Откроем файл /etc/cron.d/awstats
vi /etc/cron.d/awstats
И закомментируем все его содержимое
Установим Jailkit fail2ban and UFW
apt install -y jailkit fail2ban
Создадим набор правил
vi /etc/fail2ban/jail.local
/etc/fail2ban/jail.local
[pure-ftpd]
enabled = true
port = ftp
filter = pure-ftpd
logpath = /var/log/syslog
maxretry = 3
[dovecot]
enabled = true
filter = dovecot
action = iptables-multiport[name=dovecot-pop3imap, port="pop3,pop3s,imap,imaps", protocol=tcp]
logpath = /var/log/mail.log
maxretry = 5
[postfix]
enabled = true
port = smtp
filter = postfix
logpath = /var
Перезапустим fail2ban:
service fail2ban restart
Для установки UFW выполним:
apt install -y ufw
Поставим Roundcube Webmail
apt install -y roundcube roundcube-core roundcube-mysql roundcube-plugins roundcube-plugins-extra javascript-common libjs-jquery-mousewheel php-net-sieve tinymce
Установщик спросит:
Configure database for roundcube with dbconfig-common? <-- Yes
MySQL application password for roundcube: <-- Press enter
Откорректируем конфигурацию RoundCube config.inc.php:
vi /etc/roundcube/config.inc.php
И поменяем the default host на localhost:
$config['default_host'] = 'localhost';
Создадим ссылку чтобы использовать конфигурацию SquirrelMail configuration в ISPConfig для Roundcube:
ln -s /usr/share/roundcube /usr/share/squirrelmail
Установим ISPConfig 3.2
Перезапустим nginx
service nginx restart
Скачаем и запусти установщик с помощью команд:
cd /tmp
wget -O ispconfig.tar.gz https://www.ispconfig.org/downloads/ISPConfig-3-stable.tar.gz
tar xfz ispconfig.tar.gz
cd ispconfig3*/install/
php -q install.php
Установка выполняется согласно подсказкам установщика:
процесс установки
root@ispnginx:/tmp/ispconfig3_install/install# php -q install.php
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
>> Initial configuration
Operating System: Ubuntu 20.04.2 LTS (Focal Fossa)
Following will be a few questions for primary configuration so be careful.
Default values are in [brackets] and can be accepted with <ENTER>.
Tap in "quit" (without the quotes) to stop the installer.
Select language (en,de) [en]:
Installation mode (standard,expert) [standard]:
Full qualified hostname (FQDN) of the server, eg server1.domain.tld [ispnginx.cat-a.ru]:
MySQL server hostname [localhost]:
MySQL server port [3306]:
MySQL root username [root]:
MySQL root password []:
MySQL database to create [dbispconfig]:
MySQL charset [utf8]:
Configuring Postgrey
Configuring Postfix
Generating a RSA private key
.....................++++
................................................................................................................................................................................................++++
writing new private key to 'smtpd.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Spb
Locality Name (eg, city) []:Spb
Organization Name (eg, company) [Internet Widgits Pty Ltd]:cat-a
Organizational Unit Name (eg, section) []:it
Common Name (e.g. server FQDN or YOUR name) []:ispnginx.cat-a.ru
Email Address []:admin@cat-a.ru
[INFO] service Mailman not detected
Configuring Dovecot
Creating new DHParams file, this takes several minutes. Do not interrupt the script.
Configuring Spamassassin
Configuring Amavisd
[INFO] service Rspamd not detected
Configuring Getmail
Configuring Jailkit
Configuring Pureftpd
[INFO] service BIND not detected
[INFO] service MyDNS not detected
Configuring nginx
[INFO] service OpenVZ not detected
Configuring Ubuntu Firewall
[INFO] service Metronome XMPP Server not detected
Configuring Fail2ban
Installing ISPConfig
ISPConfig Port [8080]:
Admin password [fb07e95d]:
Do you want a secure (SSL) connection to the ISPConfig web interface (y,n) [y]: y
Checking / creating certificate for ispnginx.cat-a.ru
Using certificate path /etc/letsencrypt/live/ispnginx.cat-a.ru
--2021-05-29 05:51:24-- https://get.acme.sh/
Resolving get.acme.sh (get.acme.sh)... 104.21.34.62, 172.67.199.16, 2606:4700:3031::ac43:c710, ...
Connecting to get.acme.sh (get.acme.sh)|104.21.34.62|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘STDOUT’
- [ <=> ] 937 --.-KB/s in 0s
2021-05-29 05:51:25 (3.73 MB/s) - written to stdout [937]
Installed acme.sh and using it for certificate creation during install.
Using nginx for certificate validation
acme.sh is installed, overriding certificate path to use /root/.acme.sh/ispnginx.cat-a.ru
Symlink ISPConfig SSL certs to Postfix? (y,n) [y]: y
Symlink ISPConfig SSL certs to Pure-FTPd? Creating dhparam file may take some time. (y,n) [y]: y
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
..................................................
Configuring Apps vhost
Configuring DBServer
Installing ISPConfig crontab
no crontab for getmail
Detect IP addresses
Restarting services ...
Installation completed.
root@ispnginx:/tmp/ispconfig3_install/install#
После установки наша панель будет доступна на 8080 порту. Авторизуемся, используя пароль, указанный при установке: