Серверные инструкции · 29 min read · Sep 08, 2025

Идеальный сервер CentOS 8 с Apache, PHP, Postfix, Dovecot, Pure-FTPD, BIND и ISPConfig 3.2

Этот учебник показывает установку ISPConfig 3.2 на сервере CentOS 8 (64Bit). ISPConfig — это панель управления веб-хостингом, которая позволяет вам настраивать следующие службы через веб-браузер: веб-сервер Apache, PHP, почтовый сервер Postfix, MySQL, сервер имен BIND, PureFTPd, SpamAssassin, ClamAV, Mailman и многие другие.

1 Требования

Для установки такой системы вам понадобятся следующие компоненты:

  • Минимальная серверная система CentOS 8. Это может быть сервер, установленный с нуля, как описано в нашем учебнике по минимальному серверу CentOS 8, или виртуальный сервер или корневой сервер от хостинг-компании, на котором установлена минимальная настройка CentOS 8.
  • Быстрое интернет-соединение.

2 Предварительная заметка

В этом учебнике я использую имя хоста server1.example.com с IP-адресом 192.168.0.100 и шлюзом 192.168.0.1. Эти настройки могут отличаться у вас, поэтому вам нужно заменить их там, где это необходимо.

3 Подготовка сервера

Установите раскладку клавиатуры

Если раскладка клавиатуры сервера не соответствует вашей клавиатуре, вы можете переключиться на правильную раскладку (в моем случае “de” для немецкой раскладки клавиатуры) с помощью команды localectl:

localectl set-keymap de

Чтобы получить список всех доступных раскладок клавиатуры, выполните:

localectl list-keymaps

Я хочу установить ISPConfig в конце этого учебника, ISPConfig поставляется со скриптом брандмауэра Bastille, который я буду использовать в качестве брандмауэра, поэтому я отключаю брандмауэр по умолчанию CentOS. Конечно, вы можете оставить брандмауэр CentOS включенным и настроить его по своим нуждам (но тогда вам не следует использовать какой-либо другой брандмауэр позже, так как он, скорее всего, будет мешать брандмауэру CentOS).

Запустите…

dnf -y install net-tools wget rsyslog curl  
systemctl stop firewalld.service  
systemctl disable firewalld.service

чтобы остановить и отключить брандмауэр CentOS. Ошибки здесь допустимы, это просто указывает на то, что брандмауэр не был установлен.

Затем вам следует проверить, что брандмауэр действительно был отключен. Для этого выполните команду:

iptables -L

Вывод должен выглядеть следующим образом:

[root@server1 ~]# iptables -L  
Chain INPUT (policy ACCEPT)  
target prot opt source destination
Chain FORWARD (policy ACCEPT)  
target prot opt source destination
Chain OUTPUT (policy ACCEPT)  
target prot opt source destination

Или используйте команду firewall-cmd:

firewall-cmd --state
[root@server1 ~]# firewall-cmd --state  
not running  
[root@server1 ~]#

Теперь я установлю редактор конфигурации сети и текстовый редактор “nano”, который я буду использовать на следующих шагах для редактирования конфигурационных файлов:

dnf -y install nano wget NetworkManager-tui yum-utils

Если вы не настроили свою сетевую карту во время установки, вы можете сделать это сейчас. Запустите…

nmtui

… и перейдите к редактированию соединения:

Редактировать сетевое соединение

Выберите свой сетевой интерфейс:

Выбрать сетевой интерфейс

Затем заполните свои сетевые данные — отключите DHCP и заполните статический IP-адрес, маску подсети, ваш шлюз и один или два DNS-сервера, затем нажмите ОК:

Установить маску подсети

Затем выберите ОК, чтобы подтвердить изменения, которые вы внесли в сетевые настройки

и Выйти, чтобы закрыть инструмент конфигурации сети nmtui.

Выйти из nmtui

Теперь вам следует запустить

ifconfig

чтобы проверить, правильно ли установил установщик ваш IP-адрес:

[root@server1 ~]# ifconfig  
ens33: flags=4163  mtu 1500  
        inet 192.168.0.100  netmask 255.255.255.0  broadcast 192.168.0.255  
        inet6 fe80::20c:29ff:feee:b665  prefixlen 64  scopeid 0x20  
        inet6 2003:e1:bf22:1b00:20c:29ff:feee:b665  prefixlen 64  scopeid 0x0  
        ether 00:0c:29:ee:b6:65  txqueuelen 1000  (Ethernet)  
        RX packets 2874  bytes 1369892 (1.3 MiB)  
        RX errors 0  dropped 546  overruns 0  frame 0  
        TX packets 968  bytes 160901 (157.1 KiB)  
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
lo: flags=73  mtu 65536  
        inet 127.0.0.1  netmask 255.0.0.0  
        inet6 ::1  prefixlen 128  scopeid 0x10  
        loop  txqueuelen 1000  (Local Loopback)  
        RX packets 0  bytes 0 (0.0 B)  
        RX errors 0  dropped 0  overruns 0  frame 0  
        TX packets 0  bytes 0 (0.0 B)  
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Если ваша сетевая карта не отображается там, то она не будет включена при загрузке. В этом случае откройте файл /etc/sysconfig/network-scripts/ifcfg-eth0

nano /etc/sysconfig/network-scripts/ifcfg-ens33

и установите ONBOOT в yes:

[...]  
ONBOOT=yes  
[...]  

и перезагрузите сервер.

Проверьте ваш /etc/resolv.conf, если он перечисляет все DNS-серверы, которые вы ранее настроили:

cat /etc/resolv.conf

Если DNS-серверы отсутствуют, выполните

nmtui

и добавьте отсутствующие DNS-серверы снова.

Теперь перейдем к конфигурации…

Настройка /etc/hosts и /etc/hostname

Далее мы отредактируем /etc/hosts. Сделайте его таким:

nano /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4  
192.168.0.100   server1.example.com     server1  
  
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

Установите имя хоста в файле /etc/hostname. Файл должен содержать полное доменное имя (например, server1.example.com в моем случае), а не просто короткое имя, например “server1”. Откройте файл с помощью редактора nano:

nano /etc/hostname

И установите имя хоста в файле.

server1.example.com

Сохраните файл и выйдите из nano.

Установите SELinux в режим разрешения

SELinux — это расширение безопасности CentOS, которое должно обеспечивать расширенную безопасность. ISPConfig не поставляется с набором правил SELinux, поэтому я устанавливаю его в режим разрешения (это необходимо, если вы хотите установить ISPConfig позже).

Отредактируйте /etc/selinux/config и установите SELINUX=permissive:

nano /etc/selinux/config
# Этот файл управляет состоянием SELinux в системе.
# SELINUX= может принимать одно из этих трех значений:
#     enforcing - Политика безопасности SELinux применяется.
#     permissive - SELinux выводит предупреждения вместо применения.
#     disabled - Политика SELinux не загружена.
SELINUX=permissive
# SELINUXTYPE= может принимать одно из этих двух значений:
#     targeted - Защищены целевые процессы,
#     mls - Защита многоуровневой безопасности.
SELINUXTYPE=targeted

После этого нам нужно перезагрузить систему:

reboot

4 Включите дополнительные репозитории и установите программное обеспечение

Сначала мы импортируем GPG-ключи для программных пакетов:

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*

Затем мы включаем репозиторий EPEL в нашей системе CentOS, так как многие из пакетов, которые мы собираемся установить в ходе этого учебника, недоступны в официальном репозитории CentOS 8:

dnf -y install epel-release

Активируйте Power Tools:

dnf config-manager --set-enabled powertools

Затем мы обновляем наши существующие пакеты в системе:

dnf -y update

Теперь мы устанавливаем некоторые программные пакеты, которые понадобятся позже:

dnf -y groupinstall 'Development Tools'

5 Квота

(Если вы выбрали другую схему разбиения, чем я, вам нужно будет настроить эту главу так, чтобы квота применялась к разделам, где она вам нужна.)

Чтобы установить квоту, мы выполняем эту команду:

dnf -y install quota

Теперь мы проверяем, включена ли квота для файловой системы, где хранятся веб-сайты (/var/www) и данные Maildir (var/vmail). В этом примере у меня один большой корневой раздел, поэтому я ищу ‘ / ‘:

mount | grep ' / '
[root@server1 ~]# mount | grep ' / '  
/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,noquota)  
[root@server1 ~]#

Если у вас есть отдельный раздел /var, используйте:

mount | grep ' /var '

вместо этого. Если строка содержит слово “ noquota “, то продолжайте с следующими шагами, чтобы включить квоту.

Включение квоты на корневом разделе / (root)

Обычно вы включаете квоту в файле /etc/fstab, но если файловая система является корневой файловой системой “/“, то квота должна быть включена с помощью параметра загрузки ядра Linux.

Отредактируйте файл конфигурации grub:

nano /etc/default/grub

Найдите строку, которая начинается с GRUB_CMDLINE_LINUX, и добавьте rootflags=uquota,gquota к параметрам командной строки, чтобы получившаяся строка выглядела так:

GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rootflags=uquota,gquota"

и примените изменения, выполнив следующую команду.

cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg_bak  
grub2-mkconfig -o /boot/grub2/grub.cfg

и перезагрузите сервер.

reboot

Теперь проверьте, включена ли квота:

mount | grep ' / '
[root@server1 ~]# mount | grep ' / '  
/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,usrquota,grpquota)  
[root@server1 ~]#

Когда квота активна, мы можем видеть “ usrquota,grpquota “ в списке параметров монтирования.

Включение квоты на отдельном разделе /var

Если у вас есть отдельный раздел /var, отредактируйте /etc/fstab и добавьте,uquota,gquota к / разделу ( /dev/mapper/centos-var):

nano /etc/fstab
  
#  
# /etc/fstab  
# Создано anaconda в воскресенье, 21 сентября 2014 года, 16:33:45  
#  
# Доступные файловые системы, по ссылке, поддерживаются под '/dev/disk'  
# См. страницы man fstab(5), findfs(8), mount(8) и/или blkid(8) для получения дополнительной информации  
#  
/dev/mapper/centos-root /                       xfs     defaults        1 1  
/dev/mapper/centos-var /var                     xfs     defaults,uquota,gquota        1 2  
UUID=9ac06939-7e43-4efd-957a-486775edd7b4 /boot                   xfs     defaults        1 3  
/dev/mapper/centos-swap swap                    swap    defaults        0 0

Затем выполните

mount -o remount /var
quotacheck -avugm  
quotaon -avug

чтобы включить квоту. Если вы получите ошибку о том, что нет раздела с включенной квотой, перезагрузите сервер, прежде чем продолжить.

6 Установка Apache, PHP, MySQL и phpMyAdmin

Включите репозиторий Remi, чтобы получить более новые версии PHP (в настоящее время PHP 7.4):

dnf install http://rpms.remirepo.net/enterprise/remi-release-8.rpm  
dnf -y install yum-utils  
dnf -y module reset php  
dnf -y module install php:remi-7.4  
dnf update

Мы можем установить необходимые пакеты одной командой:

dnf -y install httpd mod_ssl mariadb-server php php-mysqlnd php-mbstring

Чтобы убедиться, что сервер не может быть атакован через уязвимость HTTPOXY, мы отключим заголовок HTTP_PROXY в apache глобально.

Добавьте правило заголовка apache в конец файла httpd.conf:

echo "RequestHeader unset Proxy early" >> /etc/httpd/conf/httpd.conf

И перезапустите httpd, чтобы применить изменение конфигурации.

service httpd restart

Установите phpMyAdmin:

cd /tmp  
wget https://files.phpmyadmin.net/phpMyAdmin/5.0.2/phpMyAdmin-5.0.2-all-languages.tar.gz  
tar xzvf phpMyAdmin-5.0.2-all-languages.tar.gz  
mkdir /usr/share/phpmyadmin  
mv phpMyAdmin-5.0.2-all-languages/* /usr/share/phpmyadmin/  
mkdir /usr/share/phpmyadmin/tmp  
chown -R apache:apache /usr/share/phpmyadmin  
chmod 777 /usr/share/phpmyadmin/tmp

Необязательно: Измените модуль Apache MPM

CentOS 8 по умолчанию использует модуль Apache MPM Event, это хорошо с одной стороны, так как позволяет использовать протокол HTTP/2. С другой стороны, это не позволяет использовать модуль apache mod_php. В общем, сегодня следует использовать PHP-FPM по умолчанию, и ISPConfig поддерживает это. Если вам нужен старый режим mod_php по причинам совместимости, вы можете переключить MPM Apache следующим образом:

nano /etc/httpd/conf.modules.d/00-mpm.conf

Добавьте # перед строкой MPM event, чтобы она выглядела так:

# LoadModule mpm_event_module modules/mod_mpm_event.so

Затем уберите # перед строкой MPM Prefork, чтобы она выглядела так:

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

Затем перезапустите httpd, чтобы применить изменение конфигурации.

service httpd restart

7 Установка Dovecot

Dovecot можно установить следующим образом:

dnf -y install dovecot dovecot-mysql dovecot-pigeonhole

Создайте пустой файл dovecot-sql.conf и создайте символические ссылки:

touch /etc/dovecot/dovecot-sql.conf  
ln -s /etc/dovecot/dovecot-sql.conf /etc/dovecot-sql.conf  
ln -s /etc/dovecot/dovecot.conf /etc/dovecot.conf

Теперь создайте системные ссылки для запуска и запустите Dovecot:

systemctl enable dovecot  
systemctl start dovecot

8 Установка Postfix

Postfix можно установить следующим образом:

dnf -y install postfix postfix-mysql

Затем откройте порты TLS/SSL и отправки в Postfix:

nano /etc/postfix/master.cf

Раскомментируйте разделы отправки и smtps следующим образом и добавьте строки, где это необходимо, чтобы этот раздел файла master.cf выглядел точно так же, как ниже. ВАЖНО: Удалите # перед строками, которые начинаются с smtps и отправки, а не только перед строками -o после этих строк!

[...]  
submission inet n - n - - 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_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 - n - - 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  
[...]  

Затем отключите Sendmail и запустите Postfix и MariaDB (MySQL):

systemctl enable mariadb.service  
systemctl start mariadb.service
systemctl enable postfix.service  
systemctl restart postfix.service

Мы отключаем sendmail, чтобы убедиться, что он не будет запущен, если он установлен на вашем сервере. Поэтому сообщение об ошибке “Не удалось выдать вызов метода: единица sendmail.service не загружена.” можно игнорировать.

Чтобы включить поддержку старых/устаревших устройств, выполните эту команду (необязательно, используйте только тогда, когда хотите, чтобы старые почтовые устройства подключались, так как это ослабляет настройку SSL/TLS, позволяя менее безопасные шифры):

update-crypto-policies --set LEGACY

9 Установка Getmail

Getmail можно установить следующим образом:

dnf install python2  
cd /tmp  
wget http://pyropus.ca/software/getmail/old-versions/getmail-5.14.tar.gz  
tar xvfz getmail-5.14.tar.gz  
cd getmail-5.14  
python2 setup.py build  
python2 setup.py install

10 Установите пароли MySQL и настройте phpMyAdmin

Установите пароли для учетной записи root MySQL:

mysql_secure_installation
[root@server1 tmp]# mysql_secure_installation  
  
ПРИМЕЧАНИЕ: РЕКОМЕНДУЕТСЯ ЗАПУСКАТЬ ВСЕ ЧАСТИ ЭТОГО СКРИПТА ДЛЯ ВСЕХ СЕРВЕРОВ MariaDB, ИСПОЛЬЗУЕМЫХ В ПРОИЗВОДСТВЕ! ПОЖАЛУЙСТА, ВНИМАТЕЛЬНО ПРОЧИТАЙТЕ КАЖДЫЙ ШАГ!
Чтобы войти в MariaDB и обеспечить ее безопасность, нам понадобится текущий пароль для пользователя root. Если вы только что установили MariaDB и еще не установили пароль root, пароль будет пустым, поэтому вам просто нужно нажать Enter здесь.
Введите текущий пароль для root (введите для отсутствия):  
Хорошо, успешно использован пароль, продолжаем...
Установка пароля root гарантирует, что никто не сможет войти в учетную запись root MariaDB без надлежащей авторизации.  

Установить пароль root? [Y/n] <-- ВВЕДИТЕ  
Новый пароль: <-- вашпарольrootsql  
Повторите новый пароль: <-- вашпарольrootsql  
Пароль успешно обновлен!  
Перезагрузка таблиц привилегий..  
 ... Успех!  
  
По умолчанию установка MariaDB имеет анонимного пользователя, позволяя любому войти в MariaDB без необходимости создания учетной записи пользователя для них. Это предназначено только для тестирования и для упрощения установки. Вам следует удалить их перед переходом в производственную среду.  
  
Удалить анонимных пользователей? [Y/n] <-- ВВЕДИТЕ  
 ... Успех!  
  
Обычно root должен иметь возможность подключаться только с 'localhost'. Это гарантирует, что кто-то не сможет угадать пароль root из сети.  
  
Запретить удаленный вход root? [Y/n] <-- ВВЕДИТЕ  
 ... Успех!  
  
По умолчанию MariaDB поставляется с базой данных с именем 'test', к которой любой может получить доступ. Это также предназначено только для тестирования и должно быть удалено перед переходом в производственную среду.  
  
Удалить тестовую базу данных и доступ к ней? [Y/n] <-- ВВЕДИТЕ  
 - Удаление тестовой базы данных...  
 ... Успех!  
 - Удаление привилегий на тестовую базу данных...  
 ... Успех!  
  
Перезагрузка таблиц привилегий гарантирует, что все изменения, сделанные до сих пор, вступят в силу немедленно.  
  
Перезагрузить таблицы привилегий сейчас? [Y/n] <-- ВВЕДИТЕ  
 ... Успех!  
  
Очистка...  
  
Все готово! Если вы завершили все вышеперечисленные шаги, ваша установка MariaDB теперь должна быть безопасной.  
  
Спасибо за использование MariaDB!  
  
[root@server1 tmp]#

Теперь мы настраиваем phpMyAdmin. Создайте этот файл конфигурации phpMyAdmin:

nano /etc/httpd/conf.d/phpmyadmin.conf

Добавьте это содержимое в файл:

# phpMyAdmin - Веб-браузер MySQL, написанный на php
# По умолчанию разрешает только localhost
# Но разрешение phpMyAdmin для всех, кроме localhost, следует считать
# опасным, если не защищено SSL

Alias /phpMyAdmin /usr/share/phpmyadmin
Alias /phpmyadmin /usr/share/phpmyadmin


   
     # Apache 2.4
  #  
     #  Require ip 127.0.0.1
     #  Require ip ::1
  #  
   
   
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from ::1
   

            

Затем мы изменим аутентификацию в phpMyAdmin с cookie на http:

cp -pf /usr/share/phpmyadmin/config.sample.inc.php /usr/share/phpmyadmin/config.inc.php  
nano /usr/share/phpmyadmin/config.inc.php
[...]  
/* Тип аутентификации */  
$cfg['Servers'][$i]['auth_type'] = 'http';  
[...]  

Затем мы создаем системные ссылки для запуска Apache и запускаем его:

systemctl enable httpd  
systemctl restart httpd

Теперь вы можете направить свой браузер на http://server1.example.com/phpmyadmin/ или http://192.168.0.100/phpmyadmin/ и войти с именем пользователя root и вашим новым паролем root MySQL.

11 Установка Amavisd-new, SpamAssassin, ClamAV и Postgrey

Чтобы установить amavisd-new, SpamAssassin и ClamAV, выполните следующую команду:

dnf -y install amavisd-new spamassassin clamav-server clamav-data clamav-update clamav-filesystem clamav clamav-scanner-systemd clamav-devel clamav-lib clamav-server-systemd unzip bzip2 perl-DBD-mysql postgrey re2c

Затем мы запускаем freshclam, amavisd и clamd.amavisd:

sa-update  
freshclam  
systemctl enable amavisd.service  
systemctl start amavisd.service  
systemctl start [email protected]  
systemctl enable postgrey.service  
systemctl start postgrey.service

На следующем шаге мы настраиваем postgrey. Откройте файл /etc/sysconfig/postgrey в редакторе:

nano /etc/sysconfig/postgrey

и измените строку:

POSTGREY_TYPE="--unix=/var/spool/postfix/postgrey/socket"

на

POSTGREY_TYPE="--inet=10023"

Сохраните файл и перезапустите postgrey:

service postgrey restart

Чтобы настроить amavisd, отредактируйте файл /etc/clamd.d/amavisd.conf:

nano /etc/clamd.d/amavisd.conf

и измените строку:

LocalSocket /run/clamd.amavisd/clamd.sock

на

LocalSocket /var/spool/amavisd/clamd.sock

Сохраните измененный файл конфигурации и перезапустите ClamAV:

systemctl restart [email protected]

Теперь нам нужно создать системный юнит для службы freshclam. Создайте новый файл /usr/lib/systemd/system/freshclam.service:

nano /usr/lib/systemd/system/freshclam.service

и введите следующее содержимое в этот файл:

[Unit]
Description = ClamAV Scanner
After = network.target

[Service]
Type = forking
# если вы хотите сканировать более одного в день, измените число 1 на желаемое число в следующей строке.
ExecStart = /usr/bin/freshclam -d -c 1
Restart = on-failure
PrivateTmp =true

[Install]
WantedBy=multi-user.target

Сохраните файл, а затем включите и запустите службу.

systemctl enable freshclam.service  
systemctl start freshclam.service  
systemctl status freshclam.service

12 Установка Apache с mod_php, mod_fcgi/PHP, PHP-FPM

ISPConfig 3 позволяет вам использовать mod_php, mod_fcgi/PHP, cgi/PHP и PHP-FPM на уровне каждого веб-сайта.

Мы можем установить Apache2 с mod_php, mod_fcgid и PHP следующим образом:

dnf -y install php php-devel php-gd php-imap php-ldap php-mysql php-odbc php-pear php-xml php-xmlrpc php-pecl-apc php-mbstring php-mcrypt php-snmp php-soap php-tidy curl curl-devel perl-libwww-perl ImageMagick libxml2 libxml2-devel mod_fcgid php-cli httpd-devel php-fpm php-intl php-imagick php-pspell wget

Затем мы открываем /etc/php.ini…

nano /etc/php.ini

… и изменяем отчет об ошибках (чтобы уведомления больше не отображались), устанавливаем часовой пояс и раскомментируем cgi.fix_pathinfo=1:

[...]  
;error_reporting = E_ALL & ~E_DEPRECATED
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT
[...]  
; cgi.fix_pathinfo обеспечивает *реальную* поддержку PATH_INFO/PATH_TRANSLATED для CGI. PHP's
; предыдущее поведение заключалось в том, чтобы установить PATH_TRANSLATED в SCRIPT_FILENAME и не понимать
; что такое PATH_INFO. Для получения дополнительной информации о PAppp.tldTH_INFO см. спецификации cgi. Установка
; этого в 1 заставит PHP CGI исправить свои пути в соответствии со спецификацией. Установка
; 0 заставляет PHP вести себя как раньше. По умолчанию 1. Вы должны исправить свои скрипты
; использовать SCRIPT_FILENAME вместо PATH_TRANSLATED.
; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=1  
[...]  
date.timezone = 'Europe/Berlin'
[...]  

Включите httpd и PHP-FPM, чтобы они запускались при загрузке, и запустите службу PHP-FPM.

systemctl start php-fpm.service  
systemctl enable php-fpm.service  
systemctl enable httpd.service

Наконец, мы перезапускаем Apache:

systemctl restart httpd

Теперь мы добавим поддержку Let’s encrypt. ISPConfig использует acme.sh в качестве клиента Let’s Encrypt. Установите acme.sh, используя следующую команду:

curl https://get.acme.sh | sh -s

13 Установка mod_python

Модуль Apache mod_python недоступен в виде RPM-пакета, поэтому мы скомпилируем его из исходников. Первый шаг — установить файлы разработки python и загрузить текущую версию mod_python в виде .tar.gz файла

dnf -y install python3-devel
cd /usr/local/src/  
wget https://fossies.org/linux/www/apache_httpd_modules/mod_python-3.5.0.tgz  
tar xfz mod_python-3.5.0.tgz  
cd mod_python-3.5.0

а затем настроить и скомпилировать модуль.

./configure --with-python=/usr/bin/python3  
make

В скомпилированном модуле есть ошибка, которая приведет к сбою установки с ошибкой “ version = “fatal: Not a git repository (or any of the parent directories): .git “. Чтобы исправить это, выполните эту команду sed (команда — одна строка!).

sed -e 's/(git describe --always)/(git describe --always 2>\/dev\/null)/g' -e 's/`git describe --always`/`git describe --always 2>\/dev\/null`/g' -i $( find . -type f -name Makefile\* -o -name version.sh )

Затем установите модуль с помощью этой команды.

make install

и включите модуль в Apache:

echo 'LoadModule python_module modules/mod_python.so' > /etc/httpd/conf.modules.d/10-python.conf  
systemctl restart httpd.service

14 Установка PureFTPd

PureFTPd можно установить следующей командой:

dnf -y install pure-ftpd

Затем создайте системные ссылки для запуска и запустите PureFTPd:

systemctl enable pure-ftpd.service  
systemctl start pure-ftpd.service

Теперь мы настраиваем PureFTPd для разрешения FTP и TLS-сессий. FTP — это очень небезопасный протокол, так как все пароли и все данные передаются в открытом виде. Используя TLS, всю связь можно зашифровать, что делает FTP гораздо более безопасным.

OpenSSL необходим для TLS; чтобы установить OpenSSL, мы просто выполняем:

dnf install openssl

Откройте /etc/pure-ftpd/pure-ftpd.conf…

nano /etc/pure-ftpd/pure-ftpd.conf

Если вы хотите разрешить FTP и TLS-сессии, установите TLS в 1, убрав # перед строкой TLS. Настоятельно рекомендуется включить TLS.

[...]  
# Этот параметр может принимать три значения :
# 0 : отключить шифрование SSL/TLS (по умолчанию).
# 1 : принимать как традиционные, так и зашифрованные сессии.
# 2 : отклонять соединения, которые не используют механизмы безопасности SSL/TLS,
#     включая анонимные сессии.
# Не раскомментируйте это бездумно. Убедитесь, что :
# 1) Ваш сервер был скомпилирован с поддержкой SSL/TLS (--with-tls),
# 2) Действительный сертификат установлен,
# 3) Только совместимые клиенты смогут войти.

TLS                      1
[...]  

Чтобы использовать TLS, мы должны создать SSL-сертификат. Я создаю его в /etc/ssl/private/, поэтому сначала создаю этот каталог:

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

Название страны (2 буквы) [XX]: <– Введите название вашей страны (например, “DE”).
Название штата или провинции (полное название) []: <– Введите название вашего штата или провинции.
Название местности (например, город) [Default City]: <– Введите название вашего города.
Название организации (например, компания) [Default Company Ltd]: <– Введите название вашей организации (например, название вашей компании).
Название организационного подразделения (например, секция) []: <– Введите название вашего организационного подразделения (например, “IT Department”).
Общее название (например, ваше имя или имя хоста вашего сервера) []: <– Введите полное доменное имя системы (например, “server1.example.com”).
Адрес электронной почты []: <– Введите свой адрес электронной почты.

Измените разрешения SSL-сертификата:

chmod 600 /etc/ssl/private/pure-ftpd.pem

Создайте файл DHParam:

openssl dhparam -out /etc/ssl/private/pure-ftpd-dhparams.pem 2048

Наконец, перезапустите PureFTPd:

systemctl restart pure-ftpd.service

Вот и все. Теперь вы можете попробовать подключиться с помощью вашего FTP-клиента; однако вам следует настроить ваш FTP-клиент на использование TLS.

15 Установка BIND

Мы можем установить BIND следующим образом:

dnf -y install bind bind-utils haveged

Создайте резервную копию существующего файла /etc/named.conf и создайте новый следующим образом:

cp /etc/named.conf /etc/named.conf_bak  
cat /dev/null > /etc/named.conf  
nano /etc/named.conf
// named.conf
// Предоставлено пакетом bind от Red Hat для настройки ISC BIND named(8) DNS
// сервера как кэшируемого только именем сервера (как локальный DNS-резолвер).
// См. /usr/share/doc/bind*/sample/ для примеров конфигурационных файлов named.
options {
        listen-on port 53 { any; };
        listen-on-v6 port 53 { any; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { any; };
                allow-recursion {"none";};
        recursion no;
};
logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};
zone "." IN {
        type hint;
        file "named.ca";
};
include "/etc/named.conf.local";

Создайте файл /etc/named.conf.local, который включается в конце /etc/named.conf ( /etc/named.conf.local позже будет заполнен ISPConfig, если вы создадите DNS-зоны в ISPConfig):

touch /etc/named.conf.local

Затем создайте ссылки для запуска и запустите BIND:

systemctl enable named.service  
systemctl start named.service  
systemctl enable haveged.service  
systemctl start haveged.service

16 Установка AWStats

AWStats можно установить следующим образом:

dnf -y install awstats perl-DateTime-Format-HTTP perl-DateTime-Format-Builder

Альтернативное веб-приложение для статистики ‘webalizer’ больше не доступно для CentOS 8, поэтому вы сможете использовать только AWStats.

17 Установка Jailkit

Jailkit используется для chroot SSH-пользователей и cronjobs. Его можно установить следующим образом:

ln -s /usr/bin/python2 /usr/bin/python  
cd /tmp  
wget http://olivier.sessink.nl/jailkit/jailkit-2.21.tar.gz  
tar xvfz jailkit-2.21.tar.gz  
cd jailkit-2.21  
./configure  
make  
make install  
cd ..  
rm -rf jailkit-2.21*

18 Установка Fail2Ban

Это необязательно, но рекомендуется, так как монитор ISPConfig пытается показать журнал.

dnf -y install iptables-services fail2ban fail2ban-systemd  
systemctl stop firewalld.service  
systemctl mask firewalld.service  
systemctl disable firewalld.service

Затем создайте файл /etc/fail2ban/jail.local и включите мониторинг для ssh, email и ftp-сервиса.

nano /etc/fail2ban/jail.local

Добавьте следующее содержимое в файл jail.local:

[sshd]  
enabled = true  
action = iptables[name=sshd, port=ssh, protocol=tcp]  
  
[pure-ftpd]  
enabled = true  
action = iptables[name=FTP, port=ftp, protocol=tcp]  
maxretry = 3  
  
[dovecot]  
enabled = true  
action = iptables-multiport[name=dovecot, port="pop3,pop3s,imap,imaps", protocol=tcp]  
maxretry = 5  
  
[postfix-sasl]  
enabled = true  
action = iptables-multiport[name=postfix-sasl, port="smtp,smtps,submission", protocol=tcp]  
maxretry = 3

Затем создайте системные ссылки для fail2ban и запустите его:

systemctl enable fail2ban.service  
systemctl start fail2ban.service

19 Установка rkhunter

rkhunter можно установить следующим образом:

dnf -y install rkhunter

20 Установка Mailman

Если вы хотите управлять почтовыми списками с помощью Mailman на вашем сервере, установите mailman сейчас. Mailman поддерживается ISPConfig, поэтому вы сможете создавать новые почтовые списки через ISPConfig позже.

dnf -y install mailman

Прежде чем мы сможем запустить Mailman, необходимо создать первый почтовый список с именем mailman:

touch /var/lib/mailman/data/aliases  
postmap /var/lib/mailman/data/aliases  
/usr/lib/mailman/bin/newlist mailman  
ln -s /usr/lib/mailman/mail/mailman /usr/bin/mailman

[root@server1 tmp]# /usr/lib/mailman/bin/newlist mailman
Введите адрес электронной почты человека, управляющего списком: <– адрес электронной почты администратора, например, [email protected]
Первоначальный пароль mailman: <– пароль администратора для списка mailman
Чтобы завершить создание вашего почтового списка, вам необходимо отредактировать ваш файл /etc/aliases (или эквивалентный) файл, добавив следующие строки, и, возможно, запустив программу newaliases:

почтовый список mailman

mailman: “|/usr/lib/mailman/mail/mailman post mailman”
mailman-admin: “|/usr/lib/mailman/mail/mailman admin mailman”
mailman-bounces: “|/usr/lib/mailman/mail/mailman bounces mailman”
mailman-confirm: “|/usr/lib/mailman/mail/mailman confirm mailman”
mailman-join: “|/usr/lib/mailman/mail/mailman join mailman”
mailman-leave: “|/usr/lib/mailman/mail/mailman leave mailman”
mailman-owner: “|/usr/lib/mailman/mail/mailman owner mailman”
mailman-request: “|/usr/lib/mailman/mail/mailman request mailman”
mailman-subscribe: “|/usr/lib/mailman/mail/mailman subscribe mailman”
mailman-unsubscribe: “|/usr/lib/mailman/mail/mailman unsubscribe mailman”

Нажмите Enter, чтобы уведомить владельца mailman… <– ENTER

[root@server1 tmp]#

Откройте /etc/aliases позже…

nano /etc/aliases

… и добавьте следующие строки:

[...]  
mailman:              "|/usr/lib/mailman/mail/mailman post mailman"
mailman-admin:        "|/usr/lib/mailman/mail/mailman admin mailman"
mailman-bounces:      "|/usr/lib/mailman/mail/mailman bounces mailman"
mailman-confirm:      "|/usr/lib/mailman/mail/mailman confirm mailman"
mailman-join:         "|/usr/lib/mailman/mail/mailman join mailman"
mailman-leave:        "|/usr/lib/mailman/mail/mailman leave mailman"
mailman-owner:        "|/usr/lib/mailman/mail/mailman owner mailman"
mailman-request:      "|/usr/lib/mailman/mail/mailman request mailman"
mailman-subscribe:    "|/usr/lib/mailman/mail/mailman subscribe mailman"
mailman-unsubscribe:  "|/usr/lib/mailman/mail/mailman unsubscribe mailman"

Запустите

newaliases

позже и перезапустите Postfix:

systemctl restart postfix.service

Теперь откройте файл конфигурации Mailman Apache /etc/httpd/conf.d/mailman.conf…

nano /etc/httpd/conf.d/mailman.conf

… и добавьте строку ScriptAlias /cgi-bin/mailman/ /usr/lib/mailman/cgi-bin/. Закомментируйте Alias /pipermail/ /var/lib/mailman/archives/public/ и добавьте строку Alias /pipermail /var/lib/mailman/archives/public/:

#
#  настройки конфигурации httpd для использования с mailman.
#
ScriptAlias /mailman/ /usr/lib/mailman/cgi-bin/
ScriptAlias /cgi-bin/mailman/ /usr/lib/mailman/cgi-bin/

    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all


#Alias /pipermail/ /var/lib/mailman/archives/public/
Alias /pipermail /var/lib/mailman/archives/public/

    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
    AddDefaultCharset Off


# Раскомментируйте следующую строку, чтобы перенаправить запросы на /mailman на страницу listinfo (рекомендуется).

# RedirectMatch ^/mailman[/]*$ /mailman/listinfo

Перезапустите Apache:

systemctl restart httpd.service

Создайте системные ссылки для Mailman и запустите его:

systemctl enable mailman.service  
systemctl start mailman.service

После установки ISPConfig 3 вы сможете получить доступ к Mailman следующим образом:

Вы можете использовать псевдоним /cgi-bin/mailman для всех виртуальных хостов Apache (обратите внимание, что suExec и CGI должны быть отключены для всех виртуальных хостов, из которых вы хотите получить доступ к Mailman!), что означает, что вы можете получить доступ к интерфейсу администратора Mailman для списка по адресу http:///cgi-bin/mailman/admin/, а веб-страница для пользователей почтового списка может быть найдена по адресу http:///cgi-bin/mailman/listinfo/.

По адресу http:///pipermail/ вы можете найти архивы почтового списка.

21 Установка Roundcube webmail

Чтобы установить клиент веб-почты RoundCube, загрузите последнюю версию с помощью wget в папку /tmp:

cd /tmp  
wget https://github.com/roundcube/roundcubemail/releases/download/1.4.3/roundcubemail-1.4.3-complete.tar.gz

Распакуйте архив tar.gz и переместите исходники RoundCube в /usr/share/roundcubemail

tar xfz roundcubemail-1.4.3-complete.tar.gz  
mkdir /usr/share/roundcubemail  
mv /tmp/roundcubemail-1.4.3/* /usr/share/roundcubemail/  
chown -R root:root /usr/share/roundcubemail  
chown apache /usr/share/roundcubemail/temp  
chown apache /usr/share/roundcubemail/logs

Создайте файл конфигурации roundcubemail.conf с помощью редактора nano:

nano /etc/httpd/conf.d/roundcubemail.conf

И добавьте следующее содержимое в этот файл:

#
# Round Cube Webmail — это многоязычный IMAP-клиент на основе браузера
#

Alias /roundcubemail /usr/share/roundcubemail  
Alias /webmail /usr/share/roundcubemail

# Определите, кто может получить доступ к веб-почте
# Вы можете увеличить разрешения после настройки


        Options none
        AllowOverride Limit
        Require all granted


# Определите, кто может получить доступ к установщику
# держите это в безопасности после настройки


        Options none
        AllowOverride Limit
        Require all granted



# Эти каталоги не должны просматриваться веб-клиентами.

    Order Allow,Deny
    Deny from all


    Order Allow,Deny
    Deny from all

Перезапустите Apache:

systemctl restart httpd.service

Теперь нам нужна база данных для RoundCube mail, мы инициализируем ее следующим образом:

mysql -u root -p

На приглашении MariaDB используйте:

CREATE DATABASE roundcubedb;  
CREATE USER roundcubeuser@localhost IDENTIFIED BY 'roundcubepassword';  
GRANT ALL PRIVILEGES on roundcubedb.* to roundcubeuser@localhost ;  
FLUSH PRIVILEGES;  
exit

Я использую данные для базы данных RoundCube в качестве примера, пожалуйста, замените значения по вашему выбору для повышения безопасности.

Теперь мы установим RoundCube в браузере по адресу http://192.168.0.100/roundcubemail/installer

Теперь создайте файл config.inc.php:

nano /usr/share/roundcubemail/config/config.inc.php

Затем нажмите “продолжить” в веб-установщике. На следующей странице нажмите кнопку “Инициализировать базу данных”.

Наконец, отключите установщик Roundecubemail. Измените файл конфигурации RoundCube config.inc.php

nano /usr/share/roundcubemail/config/config.inc.php

и измените строку:

$config['enable_installer'] = true;

на:

$config['enable_installer'] = false;

Roundcube теперь доступен по псевдонимам /webmail и /roundcubemail на вашем сервере:

http://192.168.0.100/webmail

Вход в RoundCube — это адрес электронной почты и пароль учетной записи электронной почты, которую вы создадите позже в ISPConfig.

22 Установка ISPConfig 3.2

Установщик ISPConfig настроит все службы, такие как Postfix, Dovecot и т.д., за вас.

Теперь у вас также есть возможность позволить установщику создать SSL vhost для панели управления ISPConfig, чтобы ISPConfig можно было получить по адресу https:// вместо http://. Чтобы добиться этого, просто нажмите ENTER, когда увидите этот вопрос: Хотите ли вы безопасное (SSL) соединение с веб-интерфейсом ISPConfig (y,n) [y]:.

Чтобы установить ночную сборку ISPConfig 3.2, выполните следующие действия:

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

Это запустит установщик ISPConfig 3. Установщик настроит все службы, такие как Postfix, Dovecot и т.д., за вас.

[root@server1 install]# php install.php
  
--------------------------------------------------------------------------------  
_____ ___________ _____ __ _ ____  
|_ _/ ___| ___ \ / __ \ / _(_) /__ \  
| | \ `--.| |_/ / | / \/ ___ _ __ | |_ _ __ _ _/ /  
| | `--. \ __/ | | / _ \| '_ \| _| |/ _` | |_ |  
_| |_\__/ / | | \__/\ (_) | | | | | | | (_| | ___\ \  
\___/\____/\_| \____/\___/|_| |_|_| |_|
| |  
__/ |  
|___/  
--------------------------------------------------------------------------------
  
>> Начальная конфигурация
Операционная система: CentOS 8.2

Следующие будут несколько вопросов для первичной конфигурации, поэтому будьте внимательны.
Значения по умолчанию находятся в [скобках] и могут быть приняты с помощью .
Введите “quit” (без кавычек), чтобы остановить установщик.

Выберите язык (en,de) [en]: <– Нажмите Enter

Режим установки (стандартный, эксперт) [стандартный]: <– Нажмите Enter

Полное квалифицированное имя хоста (FQDN) сервера, например server1.domain.tld [server1.example.com]: <– Нажмите Enter

Имя хоста MySQL [localhost]: <– Нажмите Enter

Порт MySQL [3306]: <– Нажмите Enter

Имя пользователя root MySQL [root]: <– Нажмите Enter

Пароль root MySQL []: <– Введите пароль root MySQL здесь

База данных MySQL для создания [dbispconfig]: <– Нажмите Enter

Кодировка MySQL [utf8]: <– Нажмите Enter

Настройка Postgrey
Настройка Postfix
Генерация 4096-битного RSA закрытого ключа
…………………………..++
……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………..++
запись нового закрытого ключа в ‘smtpd.key’

—–
Вас попросят ввести информацию, которая будет включена
в ваш запрос на сертификат.
То, что вы собираетесь ввести, называется Уникальным именем или DN.
Существует довольно много полей, но вы можете оставить некоторые пустыми
Для некоторых полей будет значение по умолчанию,
Если вы введете ‘.’, поле будет оставлено пустым.

—–
Название страны (2 буквы) [XX]: <– Введите 2-буквенный код страны, например, US
Название штата или провинции (полное название) []: <– Введите название штата или провинции
Название местности (например, город) [Default City]: <– Введите название города
Название организации (например, компания) [Default Company Ltd]: <– Введите название компании
Название организационного подразделения (например, секция) []: <– Нажмите Enter
Общее название (например, ваше имя или имя хоста вашего сервера) []: <– Введите имя хоста сервера здесь, в моем случае: server1.example.com
Адрес электронной почты []: <– Введите адрес электронной почты
Настройка mailman
Настройка Dovecot
Настройка Spamassassin
Настройка Amavisd
Настройка Getmail
Настройка Jailkit
Настройка Pureftpd
Настройка BIND
Настройка Apache
Настройка vlogger
[INFO] служба OpenVZ не обнаружена
Настройка брандмауэра Bastille
[INFO] служба Metronome XMPP Server не обнаружена
Настройка Fail2ban
Настройка Apps vhost
Установка ISPConfig
Порт ISPConfig [8080]: <– Нажмите Enter

Пароль администратора [fad579a6]: <– Введите новый пароль для пользователя администратора ISPConfig

Повторите пароль администратора []: <– Повторите пароль

Хотите ли вы безопасное (SSL) соединение с веб-интерфейсом ISPConfig (y,n) [y]: <– Нажмите Enter

Генерация RSA закрытого ключа, длина 4096 бит
………………………………………………………………………++
…..++
e равно 65537 (0x10001)
Вас попросят ввести информацию, которая будет включена
в ваш запрос на сертификат.
То, что вы собираетесь ввести, называется Уникальным именем или DN.
Существует довольно много полей, но вы можете оставить некоторые пустыми
Для некоторых полей будет значение по умолчанию,
Если вы введете ‘.’, поле будет оставлено пустым.

—–
Название страны (2 буквы) [XX]: <– Введите 2-буквенный код страны, например, US
Название штата или провинции (полное название) []: <– Введите название штата или провинции
Название местности (например, город) [Default City]: <– Введите название города
Название организации (например, компания) [Default Company Ltd]: <– Введите название компании
Название организационного подразделения (например, секция) []: <– Нажмите Enter
Общее название (например, ваше имя или имя хоста вашего сервера) []: <– Введите имя хоста сервера здесь, в моем случае: server1.example.com
Адрес электронной почты []: <– Введите адрес электронной почты

Пожалуйста, введите следующие ‘дополнительные’ атрибуты
для отправки с вашим запросом на сертификат
Пароль для вызова []: <– Нажмите Enter
Дополнительное название компании []: <– Нажмите Enter
запись RSA ключа

Настройка DBServer
Установка crontab ISPConfig
Установка crontab ISPConfig
нет crontab для root
нет crontab для getmail
Обнаружение IP-адресов
Перезапуск служб …
Установка завершена.


Установщик автоматически настраивает все подлежащие службы, поэтому ручная настройка не требуется.

## 23 Первый вход в ISPConfig

После этого вы можете получить доступ к ISPConfig 3 по адресу http(s)://server1.example.com:8080/ или http(s)://192.168.0.100:8080/ ( http или https зависит от того, что вы выбрали во время установки).

Войдите с именем пользователя admin и паролем admin (вы должны изменить пароль по умолчанию после первого входа):

![Вход в ISPConfig](/files/4c99758a-f229-4170-924d-7a3d9c4c95a1.png)

### 23.1 Руководство ISPConfig 3

Чтобы узнать, как использовать ISPConfig 3, я настоятельно рекомендую скачать руководство ISPConfig 3.

На более чем 300 страницах оно охватывает концепцию ISPConfig (администраторы, реселлеры, клиенты), объясняет, как установить и обновить ISPConfig 3, включает справочник для всех форм и полей форм в ISPConfig вместе с примерами допустимых вводов и предоставляет учебники для самых распространенных задач в ISPConfig 3. Оно также описывает, как сделать ваш сервер более безопасным и содержит раздел по устранению неполадок в конце.

## 24 Загрузка в виде виртуальной машины

Эта настройка доступна для загрузки в виде виртуальной машины в формате ova/ovf (совместимом с VMWare и Virtualbox) для подписчиков howtoforge.

Данные для входа в VM

- Пароль root: howtoforge
- Пароль пользователя "admin" ISPConfig: howtoforge
- Есть еще один пользователь оболочки с именем "howtoforge" и паролем: howtoforge

Пожалуйста, измените оба пароля при первом входе.

- IP-адрес VM: 192.168.0.100

## 25 Ссылки

- CentOS: http://www.centos.org/
- ISPConfig: http://www.ispconfig.org/
Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.