ISPConfig - бесплатная панель управления хостингом с открытым исходным кодом c возможностью управлять несколькими серверами из одной панели управления. Это один из лучших вариантов для веб-студий, хостинг-компаний, а так же для всех, кто ищет бесплатную панель управления хостингом с широким функционалом.  В сети есть инструкции по установке на OpenSuSe, Fedora, CentOS, Debian и Ubuntu разных версий, с выходом новой ОС из поддерживаемых инструкции обновляют, но инструкция под ubuntu 20.04 с nginx почему-то выпала из числа обновленных. Самое время это исправить. Убедимся, что на нашем сервере установлены последние версии всех пакетов, установлен ssh клиент и vim (или любой другой текстовый редактор, в котором вам будет удобно работать), настроен статичный ip, hosts, hostname и локали.  Для установки обновлений, ssh и текстового редактора выполним команды:sudo -sapt update && apt upgrade -y && apt autoremove -y && apt install -y ssh openssh-server nano vim-nox Настроим статичный ip, для этого откроем файл конфигурации и укажем необходимые настройки:vi /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 секунд мы не согласимся - будет использована предыдущая конфигурация: root@host:~# netplan tryWarning: Stopping systemd-networkd.service, but it can still be activated by:  systemd-networkd.socketDo you want to keep these settings?Press ENTER before the timeout to accept the new configurationChanges will revert in 116 seconds Также  применить конфигурацию можно с помощью команды netplan applyОткроем файл hosts командойvi /etc/hostsи убедимся в наличии строки указывающей на наш сервер, как по имени хоста,  так по имени хоста и домену (ispnginx - имя хоста, сat-a.ru - домена): 127.0.0.1       localhost.localdomain   localhost185.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-loopbackfe00::0 ip6-localnetff02::1 ip6-allnodesff02::2 ip6-allroutersff02::3 ip6-allhosts Установим хостнейм, выполнив команды:echo ispnginx > /etc/hostname && hostname ispnginxилиhostnamectl set-hostname ispnginxПроверим, изменился ли hostname командами: hostname hostname -f root@host:~# hostnameispnginxroot@host:~# hostname -fispnginx.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" service apparmor stop && update-rc.d -f apparmor remove && apt-get remove apparmor apparmor-utils apt install -y ntp ntpdate Установим 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 указываем hostnameGeneral type of mail configuration: <-- Internet SiteSystem mail name: <-- server1.example.comОткроем TLS/SSL и submission порты в Postfix, для этого откроем файл /etc/postfix/master.cfvi /etc/postfix/master.cfи раскомментируем секции submission,  smtps, а также по первые 3 строчки в каждой секции и добавим к обеим  секциям строку (не забываем 2 пробела в начале строки): -o smtpd_client_restrictions=permit_sasl_authenticated,reject smtp      inet  n       -       y       -       -       smtpd#smtp      inet  n       -       y       -       1       postscreen#smtpd     pass  -       -       y       -       -       smtpd#dnsblog   unix  -       -       y       -       0       dnsblog#tlsproxy  unix  -       -       y       -       0       tlsproxysubmission 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=ORIGINATINGsmtps     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.1mysqlx-bind-address    = 127.0.0.1Ниже добавим строку:mysqlx=OFF vi /etc/mysql/mysql.conf.d/mysqld.cnf ## * 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.1mysqlx=OFF Перезапустим mysql и проверим, что сетевой доступ к mysql включен командой:service mysql restart && netstat -tap | grep mysql root@ispnginx:~# netstat -tap | grep mysqltcp6       0      0 [::]:mysql              [::]:*                  LISTEN      18513/mysqldroot@ispnginx:~# Выполним установку командой: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 stopupdate-rc.d -f spamassassin removeЗапустим ClamAV freshclamservice clamav-daemon start root@ispnginx:~# service spamassassin stoproot@ispnginx:~# update-rc.d -f spamassassin removeroot@ispnginx:~# freshclamWARNING: Ignoring deprecated option SafeBrowsing at /etc/clamav/freshclam.conf:22ERROR: /var/log/clamav/freshclam.log is locked by another processERROR: Problem with internal logger (UpdateLogFile = /var/log/clamav/freshclam.log).ERROR: initialize: libfreshclam init failed.ERROR: Initialization error!root@ispnginx:~# service clamav-daemon startroot@ispnginx:~# Установим nginxapt-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 cgi.fix_pathinfo=0date.timezone="Europe/Moscow"short_open_tag = On Перезагрузим PHP-FPM:service php7.4-fpm reloadЧтобы получить поддержку CGI в nginx, установим Fcgiwrap:apt-get -y install fcgiwrap 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 apt install -y  certbot pure-ftpd-common pure-ftpd-mysql quota quotatool Отредактируем файл /etc/default/pure-ftpd-common и убедимся, что start mode = standalone и VIRTUALCHROOT=truevi /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: 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 -avugmquotaon -avug root@ispnginx:~# mount -o remount quotacheck -avugmquotacheck: Scanning /dev/vda1 [/] donequotacheck: 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 filesquotacheck: 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 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.listwget -O - https://deb.goaccess.io/gnugpg.key | apt-key --keyring /etc/apt/trusted.gpg.d/goaccess.gpg add -apt updateapt install goaccessОткроем файл /etc/cron.d/awstats vi /etc/cron.d/awstatsИ закомментируем все его содержимое apt install -y jailkit fail2banСоздадим набор правилvi /etc/fail2ban/jail.local enabled  = trueport     = ftpfilter   = pure-ftpdlogpath  = /var/log/syslogmaxretry = 3 enabled = truefilter = dovecotaction = iptables-multiport[name=dovecot-pop3imap, port="pop3,pop3s,imap,imaps", protocol=tcp]logpath = /var/log/mail.logmaxretry = 5 enabled  = trueport     = smtpfilter   = postfixlogpath  = /var Перезапустим fail2ban:service fail2ban restartДля установки UFW выполним:apt install -y ufw 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? <-- YesMySQL 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 Перезапустим nginxservice nginx restartСкачаем и запусти установщик с помощью команд:cd /tmp wget -O ispconfig.tar.gz https://www.ispconfig.org/downloads/ISPConfig-3-stable.tar.gztar xfz ispconfig.tar.gzcd ispconfig3*/install/php -q install.php Установка выполняется согласно подсказкам установщика: root@ispnginx:/tmp/ispconfig3_install/install# php -q install.php---------------------------------------------------------------------------------------------------------------------------------------------------------------->> Initial configurationOperating 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 PostgreyConfiguring PostfixGenerating a RSA private key.....................++++................................................................................................................................................................................................++++writing new private key to 'smtpd.key'-----You are about to be asked to enter information that will be incorporatedinto 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 blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Country Name (2 letter code) [AU]:RUState or Province Name (full name) [Some-State]:SpbLocality Name (eg, city) []:SpbOrganization Name (eg, company) [Internet Widgits Pty Ltd]:cat-aOrganizational Unit Name (eg, section) []:itCommon Name (e.g. server FQDN or YOUR name) []:ispnginx.cat-a.ruEmail Address []:admin@cat-a.ru[INFO] service Mailman not detectedConfiguring DovecotCreating new DHParams file, this takes several minutes. Do not interrupt the script.Configuring SpamassassinConfiguring Amavisd[INFO] service Rspamd not detectedConfiguring GetmailConfiguring JailkitConfiguring Pureftpd[INFO] service BIND not detected[INFO] service MyDNS not detectedConfiguring nginx[INFO] service OpenVZ not detectedConfiguring Ubuntu Firewall[INFO] service Metronome XMPP Server not detectedConfiguring Fail2banInstalling ISPConfigISPConfig Port [8080]:Admin password [fb07e95d]:Do you want a secure (SSL) connection to the ISPConfig web interface (y,n) [y]: yChecking / creating certificate for ispnginx.cat-a.ruUsing 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 OKLength: unspecified [text/html]Saving to: ‘STDOUT’-                                                               [ <=>                                                                                                                                     ]     937  --.-KB/s    in 0s2021-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 validationacme.sh is installed, overriding certificate path to use /root/.acme.sh/ispnginx.cat-a.ruSymlink ISPConfig SSL certs to Postfix? (y,n) [y]: ySymlink ISPConfig SSL certs to Pure-FTPd? Creating dhparam file may take some time. (y,n) [y]: yGenerating DH parameters, 2048 bit long safe prime, generator 2This is going to take a long time..................................................Configuring Apps vhostConfiguring DBServerInstalling ISPConfig crontabno crontab for getmailDetect IP addressesRestarting services ...Installation completed.root@ispnginx:/tmp/ispconfig3_install/install# После установки наша панель будет доступна на 8080 порту. Авторизуемся, используя пароль, указанный при установке: Системный администратор