Однако прежде чем я установил Oracle Linux 9, на сервере какое-то время просуществовала CentOS 7, заменившая Ubuntu Server 18.04. Такая миграция сначала была связана с изменением моих предпочтений (деривативы RHEL стали нравится больше) с последующим концом старой доброй CentOS, а также моим желанием перейти на btrfs с комбинации LVM и ext4.

Введение

Наверное сразу стоит пояснить, что за Oracle Linux 9 такой. Срок поддержки "семерки" заканчивался и надо было обновляться. К сожалению, CentOS 8 просуществовала крайне недолго, а вместо 9-й теперь предлагается CentOS Stream. Ее недостаток - она идет впереди RHEL (но, справедливости ради, все же позади Fedora), что делает ее не совсем "той самой" CentOS. Это изменение политики вылилось в раскол и появление Rocky Linux, однако возник другой нюанс в виде прекращения поддержки btrfs в RHEL! Тут на сцену и выходит Oracle Linux с его уникальным Unbreakable Enterprise Kernel (UEK), которое эту самую btrfs все еще поддерживает.

Тему btrfs я немного затрагивал в обзоре TrueNAS. LVM с ext4 поверх мне не очень нравится тем, что это все же две сущности и, допустим, изъятие физического диска из "массива" осуществляется не самым тривиальным образом. Также у меня периодически наблюдались некие фризы, но не факт, что дело было в LVM - возможно это все-таки один из дисков тупил. Как бы то ни было, btrfs вопросы удаления и добавления устройств решает, как мне кажется, значительно более наглядно. К тому же, в отличие от ext4, она хранит контрольные суммы файлов, что позволяет выявлять ошибки в их содержимом (btrfs scrub). Да и подтома (subvolume) с компрессией иногда приходятся ко двору.

Возникает вопрос - а как же ZFS? На CentOS 7 я ее поднимать не рискнул, а потом уже как бы и ни к чему было - опять все по новой копировать особого желания у меня не возникает. Поддержка же btrfs в CentOS была, судя по всему, искаропки.

Прежде чем устанавливать CentOS, я, разумеется, сохранил все, что только можно, а еще и образ диска снял Клонзиллой. Нюанс установки CentOS заключался в том, что я решил сделать это, во-первых, в режиме UEFI, а во-вторых, графический режим почему-то не заработал и пришлось работать в текстовом. Концептуально он аналогичен графическому, однако настройка имени хоста и сетевого адаптера мне показалась даже более наглядной. Наконец, я решил "диск" (KingSpec NT-256) тоже отформатировать сразу в btrfs. Да, помимо всего прочего ОС "переезжала" с жесткого диска WD Se на SSD.

Еще предварительное условие - подавляющее большинство команд требуют повышенных привилегий. Я в основном при настройке ОС работаю под root, но если что - sudo в помощь.

Миграция с LVM на btrfs

Это, в свою очередь, стало возможным за счет покупки очередного "красного" диска (теперь уже без кавычек, хотя тоже, как говорится, есть нюанс), поскольку способа конвертация подобно FAT → NTFS в таком случае не существует.

Для начала нужно подключить старый логический том к CentOS. Установил lvm2:

yum install lvm2

И перезагрузился, чтобы система определила том (lvr в группе lvmred) как устройство (/dev/dm-0, он же /dev/mapper/lvmred-lvr или /dev/lvmred/lvr). Создал директорию для точки монтирования (mkdir /mnt/lvmred) и добавил в /etc/fstab:

# LVM
/dev/mapper/lvmred-lvr	/mnt/lvmred     ext4    defaults	0	2

Далее создал файловую систему (btrfs) прямо на диске:

mkfs.brtfs -f /dev/sda

Да, довольно внезапно диск оказался sda (а KingSpec - sdf, если что). Флаг -f нужен для принудительной перезаписи имеющихся файловых систем (я сначала тестировал диск в Windows на NTFS).

Смонтировал вновь созданную ФС:

mkdir /mnt/redbtr
mount -t btrfs /dev/sda /mnt/redbtr

Я планировал несколько подтомов, но для начала создал один для замены старой системы:

btrfs subvolume create /mnt/redbtr/lvmred

Добавил вновь созданный подтом в /etc/fstab:

UUID=0d428733-2170-4fb0-8ed2-a40c9954bd8c       /mnt/redbtr     btrfs   subvol=lvmred   0       0

UUID файловой системы btrfs должна была показать mkfs, но в случае чего его можно получить с помощью btrfs filesystem show.

После перезагрузки началось самое "интересное" - копирование файлов. Делал это частично в mc, частично через Webmin (да, тогда я им еще иногда пользовался). После того, как очередная порция копировалась (и удалялась в исходном расположении), уменьшал размер логического тома (вместе с файловой системой):

lvresize --resizefs --size -4T /dev/lvmred/lvr

В данном примере я уменьшил том на 4 терабайта. Разумеется, запас свободного места должен быть больше. Процесс относительно весьма длительный.

Просмотреть же логические тома можно так:

# lvdisplay
LV Path                /dev/lvmred/lvr

Согласно моим заметкам (давно уже было дело pardon), физические тома высвобождаются "с конца" и pvmove для них как бы не нужен. Проконтролировать это можно через pvdisplay. Тем не менее, допустим я теперь хочу удалить /dev/sdd из LVM и добавить к btrfs:

pvmove -v /dev/sdd
vgreduce lvmred /dev/sdd
pvremove /dev/sdd
btrfs device add /dev/sdd /mnt/redbtr

Иначе говоря, для надежности переносим все данные с физического тома (pvmove), удаляем его из группы томов (vgreduce); наконец, удаляем том (pvremove) и добавляем диск к btrfs.

Когда останется последний диск, нужно удалить "массив" целиком:

umount /mnt/lvmred
lvchange -a n /dev/lvmred/lvmred
lvremove /dev/lvmred/lvmred
vgremove lvmred
pvremove /dev/sdb

Сначала размонтируем ФС, далее деактивируем и удаляем логический том, а затем удаляем группу томов и физический том. Фух.

Добавил оставшийся диск к brtfs и "перенацелил" /etc/fstab теперь уже на постоянной основе:

# exLVM
UUID=0d428733-2170-4fb0-8ed2-a40c9954bd8c       /mnt/lvmred     btrfs   subvol=lvmred   0       0

И в очередной раз перезагрузился.

В идеале бы сделать полный ребаланс btrfs (например btrfs balance start /mnt/lvmred), да только диски жалко (опять тягать туда-сюда десяток терабайт). Так что бессовестным образом оставил все как есть.

Установка Oracle Linux 9

Разумеется, предварительно опять пришлось все сохранять, поскольку систему устанавливал с нуля. SSD-шка, таким образом, в процессе установки снова была полностью переформатирована в btrfs. Кстати, в отличие от CentOS, я не стал заморачиваться с UEFI.

Основной засадой установки OL9 с UEK является указание источников установки (репозиториев) врукопашную! А их понадобится минимум 3 - BaseOS, AppStream и нужный нам (вам) UEK - в моем случае UEK Release 7 на основе ядра Linux 5.15. Эти ссылки можно взять с https://yum.oracle.com/oracle-linux-9.html, правда потом надо еще и начало и конец удалять:

  • BaseOS - yum.oracle.com/repo/OracleLinux/OL9/baseos/latest/x86_64
  • AppStream - yum.oracle.com/repo/OracleLinux/OL9/appstream/x86_64
  • UEKR7 - yum.oracle.com/repo/OracleLinux/OL9/UEKR7/x86_64

Хорошо хоть буфер обмена работает (Ctrl+C / Ctrl+V), так что главное ввести основной репозиторий. Скриншот с виртуалки:

VirtualBox_OL9 ServPC.png

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

Настройка ОС

В отличие от CentOS, теперь менеджер пакетов dnf, так что после установки:

dnf update
dnf install mc
dnf install epel-release

Хотя update именно сразу после установки не нужен за счет наших с вами мучений по заполнению ссылок. Как видите, я устанавливаю Midnight Commander, а еще я предлагаю сразу же установить EPEL (Extra Packages for Enterprise Linux), поскольку он потребуется почти для всего остального.

Хочу показать вам структуру btrfs системного диска:

[root@servpc ~]# btrfs filesystem show
Label: 'ol'  uuid: 1048f3e1-89e4-45f5-a893-a91202a94f40
        Total devices 1 FS bytes used 31.64GiB
        devid    1 size 238.47GiB used 50.02GiB path /dev/sdf1

[root@servpc ~]# btrfs subvolume list /
ID 256 gen 1605122 top level 5 path boot
ID 257 gen 1605127 top level 5 path root
ID 258 gen 1605122 top level 5 path home

[root@servpc ~]# lsblk /dev/sdf
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sdf      8:80   0 238.5G  0 disk
└─sdf1   8:81   0 238.5G  0 part /home
                                 /boot
                                 /

[root@servpc ~]# mount | grep sdf
/dev/sdf1 on / type btrfs (rw,relatime,ssd,space_cache=v2,subvolid=257,subvol=/root)
/dev/sdf1 on /boot type btrfs (rw,relatime,ssd,space_cache=v2,subvolid=256,subvol=/boot)
/dev/sdf1 on /home type btrfs (rw,relatime,ssd,space_cache=v2,subvolid=258,subvol=/home)

Установщик создал три подтома для соответствующих точек монтирования. Также автоматически включается оптимизация btrfs под SSD. По умолчанию, впрочем, таймер оптимизации (TRIM) отключен, так что его надо бы включить:

systemctl enable fstrim.timer

Раздела подкачки нет, "от щедрот" сделал файл аж на 8 гигов. Он делается почти как обычно, только в случае btrfs необходимо отключить копирование при записи (NODATACOW - chattr +C) для этого файла:

cd /
truncate -s 0 swapfile
chattr +C swapfile
fallocate -l 8G swapfile
chmod 0600 swapfile
mkswap swapfile
swapon swapfile

На постоянку добавил в /etc/fstab:

# swap
/swapfile       none    swap    defaults        0       0

В завершение раздела сделаем то, что на VDS/VPS делать ни в коем случае нельзя, но на домашнем сервере пожалуй можно - отключим SELinux, чтобы не мешался. Делается это путем добавления параметра загрузки ОС selinux=0 в файле /etc/default/grub:

GRUB_CMDLINE_LINUX="crashkernel=1G-64G:448M,64G-:512M selinux=0"

После чего нужно переконфигурировать grub:

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

Либо вместо всего вышеуказанного выполнить команду:

 grubby --update-kernel ALL --args selinux=0

На всякий пожарный я бы все же еще отредактировал параметр SELINUX в /etc/selinux/config - присвоил disabled (что и сделал) или permissive. Изменения вступят в силу после перезагрузки.

UPS

Ранее я пользовался бесперебойником Powercom BNT-600AP, а когда очередной аккумулятор немного того, я что-то взял и заменил весь источник на Eaton 5E. Впрочем, с точки зрения настройки они не отличаются, поскольку работают через универсальный драйвер usbhid-ups.

Собственно, вот EPEL сразу же и пригодился, поскольку пакет nut (Network UPS Tools) находится именно в нем.

dnf install nut

Расположение конфигов /etc/ups несколько отличается от Ubuntu, но концептуально все примерно то же самое.

Устанавливаем локальный режим работы в nut.conf:

MODE=standalone

В ups.conf добавляем секцию настроек:

[EATON5E]
driver=usbhid-ups
port=auto
desc="Eaton 5e650iupsdin"
#override.battery.charge.low=25

Последняя строчка закомментирована, но в принципе это возможность переопределения уровня низкого заряда батареи.

В upsd.users добавляем администратора nut (admin):

[admin]
password = password
upsmon master
actions = SET
instcmds = ALL

Фактический пароль у меня другой конечно же.

Наконец, прописываем мониторинг "упсы" в upsmon.conf:

MONITOR EATON5E@localhost 1 admin password master

Включаем кучу сервисов и не только:

systemctl enable nut-server
systemctl enable nut-monitor
systemctl enable nut-driver.target
systemctl enable nut.target

Перезагружаемся, чтобы вся эта страсть заработала, и проверяем:

upsc EATON5E

Еще можно сделать веб-интерфейс, но этим мы займемся после установки веб-сервера.

S.M.A.R.T.

Откровенно говоря, я не стал заниматься какой-то автоматизацией, а лишь изредка запускаю небольшой скриптик. Установил smartmontools:

dnf install smartmontools

Под админом (serv) создал скрипт, в котором по очереди запрашиваю состояние дисков:

echo "/dev/sda"
smartctl -iAH /dev/sda
echo "/dev/sdb"
smartctl -iAH /dev/sdb
echo "/dev/sdc"
smartctl -iAH /dev/sdc
echo "/dev/sdd"
smartctl -iAH /dev/sdd
echo "/dev/sde"
smartctl -iAH /dev/sde
echo "/dev/sdf"
smartctl -iAH /dev/sdf

Где параметры управляют выводом:

  • -i - идентификационной информацию об устройстве;
  • -A - специфических атрибутов вендоров;
  • -H - информации о "здоровье" устройства.

Вызываю его с повышением привилегий и перенаправлением вывода в файл (это, наверное, единственное исключение в статье, где я явно работаю под админом, а не root):

sudo ./smart > smart.txt

После чего можно в спокойной обстановке его проанализировать (echo помогает отличить один диск от другого). Если не хочется просматривать целиком, можно сделать какой-нибудь grep для вывода количества переназначенных секторов и текущей температуры (как пожалуй наиболее критических показателей):

grep "Reallocated_Sector_Ct\|Temperature_Celsius" smart.txt

Неудобство в том, что таблица вывода атрибутов не помещается в стандартные 80 символов. Так что просмотр этих сведений - то немногое, что заставляет меня скучать по Webmin (который я давно перестал устанавливать).

BOINC

Я устанавливаю клиент распределенных вычислений (опять же из EPEL), чтобы сервер не простаивал зря:

dnf install boinc-client

Для настройки удаленного управления клиентом лучше всего сначала сделать старт-стоп сервиса, чтобы создалась директория и файлы конфигурации. Необходимо создать файл /var/lib/boinc/remote_hosts.cfg со списком разрешенных IP-адресов, а пароль взять из gui_rpc_auth.cfg.

Еще нужно открыть порт 31416 в firewalld, лучше через определение сервиса. Например, файл /etc/firewalld/services/boinc-rpc.xml:

<?xml version="1.0" encoding="utf-8"?>
<service>
    <short>Boinc RPC</short>
    <description>
        Controlling BOINC remotely
    </description>
    <port protocol="tcp" port="31416" />
</service>

Включаем сервис и открываем порт:

systemctl start boinc-client
systemctl enable boinc-client
firewall-cmd --permanent --add-service=boinc-rpc
firewall-cmd --reload

Большинство задач приходит в виде виртуальных машин VirtualBox, следовательно, очень желательно его установить. К этому времени уже существовал 7.0, но я решил установить старый добрый 6.1. В принципе это можно сделать прямо из RPM по ссылке - что-то вроде:

dnf install https://download.virtualbox.org/virtualbox/6.1.42/VirtualBox-6.1-6.1.42_155177_el9-1.x86_64.rpm

Хотя именно в OL9 лучше воспользоваться специальным "разработчитским" репозиторием:

dnf install oraclelinux-developer-release-*
dnf install VirtualBox-6.1

В любом случае при установке сообщается, что ОС не может собирать модули ядра и надо бы установить несколько пакетов и переконфигурировать VirtualBox:

dnf install gcc make perl kernel-uek-devel
vboxconfig

Засада в том, что gcc тянет за собой "обычные" kernel-headers, которые так-то вроде не нужны, но и проблем кажется не создают.

У меня возникала ошибка вычислений, возможное решение - добавить PrivateTmp=true в определение сервиса.

systemctl edit boinc-client

В предназначенное для этого место добавить:

[Service]
PrivateTmp=true

Samba

Установим пакет:

dnf install samba

По традиции я создаю "частного" пользователя, поскольку хочу ограничить доступ к некоторым каталогам. А для обратной совместимости с Ubuntu создаю группу sambashare и добавляю админа (serv) в нее.

useradd private
passwd private
groupadd -g 117 sambashare
usermod -a -G sambashare serv

Относительно параметров по умолчанию в глобальной секции:

  • меняю рабочую группу на принятую в Windows: workgroup = WORKGROUP
  • для красоты добавляю описание сервера по аналогии с Ubuntu: server string = %h server (Samba, Oracle Linux)
  • добавляю гостевой доступ: map to guest = Bad User

Затем удаляю (комментирую) автоматический шаринг домашних директорий. Вообще принтеры мне тоже не нужны, но почему-то их оставляю. При переносе конфигурации Самбы из Ubuntu еще в CentOS удалил устаревшие директивы only user, а затем уже OL9 заругался на глобальные параметры гостя (guest account). Проверить конфигурацию можно командой testparm.

Кстати вот так можно вывести старый конфиг Самбы от Ubuntu без комментариев:

egrep -v "^$|^[[:space:]]*[#;]" smb.conf

В итоге мой /etc/samba/smb.conf выглядит так:

# See smb.conf.example for a more detailed config file or
# read the smb.conf manpage.
# Run 'testparm' to verify the config is correct after
# you modified it.
#
# Note:
# SMB1 is disabled by default. This means clients without support for SMB2 or
# SMB3 are no longer able to connect to smbd (by default).

[global]
        workgroup = WORKGROUP
        server string = %h server (Samba, Oracle Linux)
        security = user
        map to guest = Bad User

        passdb backend = tdbsam

        printing = cups
        printcap name = cups
        load printers = yes
        cups options = raw

#[homes]
#       comment = Home Directories
#       valid users = %S, %D%w%S
#       browseable = No
#       read only = No
#       inherit acls = Yes

[printers]
        comment = All Printers
        path = /var/tmp
        printable = Yes
        create mask = 0600
        browseable = No

[print$]
        comment = Printer Drivers
        path = /var/lib/samba/drivers
        write list = @printadmin root
        force group = @printadmin
        create mask = 0664
        directory mask = 0775

[SHARED]
path = /mnt/lvmred/SHARED
force user = serv
force group = sambashare
public = yes
writeable = yes

[VIDEO]
path = /mnt/lvmred/VIDEO
force group = sambashare
force user = serv
valid users = serv,private,nobody
write list = private
read list = serv,nobody
public = yes
writeable = yes
create mode = 644

[TORR]
path = /mnt/storage/torr
valid users = private
writeable = yes
browseable = no

[LOCAL]
path = /mnt/lvmred/Local
valid users = private
writeable = yes
browseable = no

Концепция такая:

  • SHARED - общий ресурс с доступом на запись
  • VIDEO - фильмы, сериалы и т.д. - доступ на запись для private, остальные - только чтение
  • TORR - торренты, скрытый ресурс с доступом только для private
  • LOCAL - бэкапы, дистрибутивы и т.п. - аналогично

Для видосиков я еще и права при создании файлов переопределил (644), а то они по умолчанию 744.

Теперь необходимо сопоставить пользователей Самбы с системными пользователями:

smbpasswd -a serv
smbpasswd -e serv
smbpasswd -a private
smbpasswd -e private

-a – добавление с установкой пароля, -e – включение.

Включаем и запускаем сервисы:

systemctl enable --now smb
systemctl enable --now nmb

Наконец, надо открыть порты. К счастью, соответствующий сервис уже предусмотрен:

firewall-cmd --permanent --add-service=samba
firewall-cmd --reload

Торренты

По традиции я пользуюсь transmission-daemon, запущенным под пользователем private. Последнего мы уже создали ранее, а первого устанавливаем из EPEL:

dnf install transmission-daemon

Делаем старт/стоп сервиса, чтобы получить конфигурацию по умолчанию (/var/lib/transmission/.config/transmission-daemon/settings.json):

systemctl start transmission-daemon
systemctl stop transmission-daemon

Далее я восстановил старый конфиг (сначала из Ubuntu, затем CentOS) - /home/private/.config/transmission-daemon (в случае новой установки, соответственно, потребовалось бы скопировать /var/lib/transmission/.config/transmission-daemon) и на всякий случай скопировал дефолтный settings.json как settings.json.dist в подкаталог пользователя. Впрочем, принципиальных изменений я не обнаружил.

Конечно же потом:

chown -R private:private /home/private/.config

Суть самих настроек я описывал еще для Ubuntu 14.04. Самое главное - нужно включить RPC, после чего оставшиеся настройки можно выполнять в удаленном клиенте или через веб-интерфейс (порт 9091 в соответствии с настройкой).

"rpc-authentication-required": false,
"rpc-enabled": true,
"rpc-port": 9091,
"rpc-whitelist": "127.0.0.1, 192.168.1.*",
"rpc-whitelist-enabled": true,

Тем не менее, я продолжу править файл. Настроил директории:

"download-dir": "/mnt/storage/torr/DOWNLOADS",
"watch-dir": "/mnt/storage/torr/AUTOLOAD",
"watch-dir-enabled": true,

Раньше я настраивал отдельную директорию для незавершенных закачек, но потом решил, что особого смысла в ней нет ("incomplete-dir-enabled": false). Заодно отключил предварительное выделение места под файлы ("preallocation": 0). Хм, кстати директория наблюдения (watch-dir) кажется не настраивается удаленно - суть ее в том, чтобы скидывать туда файлы торрентов для автоматического добавления.

Предлагаю включить принудительное шифрование: "encryption": 2. Еще я настраиваю ограничение скорости раздачи днем (с 8 утра до часу ночи), чтобы не слишком забивать канал:

"alt-speed-down": 3000,
"alt-speed-enabled": true,
"alt-speed-time-begin": 480,
"alt-speed-time-day": 127,
"alt-speed-time-enabled": true,
"alt-speed-time-end": 60,
"alt-speed-up": 2000,

Меняем пользователя в определении сервиса. Лучше было бы через systemctl edit, но я что-то взял и отредактировал непосредственно /usr/lib/systemd/system/transmission-daemon.service:

User=private

Этого достаточно, поскольку папка настроек по умолчанию ~/.config/transmission-daemon.

Осталось пробросить порты в firewalld - 9091 для удаленного управления, а также я предлагаю рандомизировать порт самого торрента с помощью UPnP. Соответствующие настройки в settings.json:

"peer-port-random-on-start": true,
"port-forwarding-enabled": true,

Пример определения сервиса /etc/firewalld/services/transmission.xml:

<?xml version="1.0" encoding="utf-8"?>
<service>
    <short>Transmission Daemon</short>
    <description>Transmission Daemon provides an interface to manage Transmission BitTorrent client.</description>
    <port protocol="tcp" port="9091"/>
</service>

Соответственно добавляем вновь созданный сервис и стандартный upnp-client в firewalld:

firewall-cmd --permanent --add-service=transmission
firewall-cmd --permanent --add-service=upnp-client
firewall-cmd --reload

Довольно длительное время в EPEL была версия 3.0.0, у которой существенным образом текла память. На скорую руку решил проблему перезапуском сервиса через crontab root'а:

0 4 * * * systemctl restart transmission-daemon

К счастью все же последовало обновление до 4.0.5, которая уже не течет. Таким образом, из cron'а эту страсть убрал.

Emby

Мой выбор медиасервера. Почему-то до сих пор для загрузки надо выбирать CentOS… Хотя можно и Fedora - пакет один и тот же. Он устанавливается прямо с URL, например:

dnf install https://github.com/MediaBrowser/Emby.Releases/releases/download/4.7.12.0/emby-server-rpm_4.7.12.0_x86_64.rpm

Сервис включается и запускается сразу после установки. Чтобы восстановить архив, нужно сервис сначала выключить:

systemctl stop emby-server

Основная директория - /var/lib/emby. Перед восстановлением я на всякий случай переименовал каталоги config и data в config.dist и data.dist соответственно. Далее восстановил их из архива, а также каталоги metadata и localization. Честно говоря, не уверен, что последний из них нужен scratch, поскольку изначально такого каталога нет, а судя по датам он тянется еще из Ubuntu. В cache, plugins и root скопировал недостающие вложенные директории. Опять же, есть подозрение, что cache можно было не восстанавливать.

Как и в случае с trasmission, для надежности стоит восстановить владельца:

chown -R emby:emby /var/lib/emby

И опять нужно открывать порт (8096). Сервис для firewalld (/etc/firewalld/services/emby-server.xml) входит в пакет, так что:

firewall-cmd --permanent --add-service=emby-server
firewall-cmd --reload

В один "прекрасный" момент TMDB заблокировал Россию, так что теперь еще нужно немного похимичить с /etc/hosts - прописать IP-адреса, чтобы подтягивать метаданные:

108.157.4.61 themoviedb.org
65.9.49.79 www.themoviedb.org
108.157.4.61 api.themoviedb.org
138.199.37.231 image.tmdb.org
54.192.99.19 images.tmdb.org
54.192.99.23 api.tmdb.org

Вот теперь можно запускать сервис обратно.

Веб-сервер

На домашнем сервере я "по классике" разворачиваю LAMP (Linux - Apache - MySQL - PHP), чем мы сейчас и займемся. Поскольку у нас btrfs, для пущей важности можно предварительно создать подтом:

btrfs subvolume create /var/www

Хотя сам я так сделал в CentOS, но не OL9.

PHP

Актуальные версии PHP находятся в репозитории Remi, подключаем его:

dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm

Посмотреть, какие версии доступны, можно командой dnf module list php. Мне нужен remi-8.3, включаем его и устанавливаем базовый набор:

dnf module enable php:remi-8.3
dnf install php composer

Под шумок я тут еще и composer подтянул (из EPEL). Для последнего желательно, чтобы в системе был установлен архиватор (например unzip) и git - если что, все это также есть в пакетах. При необходимости (которая, скорее всего, возникнет), можно (нужно!) установить дополнительные расширения, например:

dnf install php-gd php-mysqlnd php-bcmath

На домашнем сервере правки /etc/php.ini, скорее всего, не особо нужны - хотя можно подрегулировать параметры потребления памяти, размера загружаемых файлов и т.д. Например:

memory_limit = 384M
post_max_size = 16M
upload_max_filesize = 8M

Apache

Пакет php почему-то подтягивает лишь части "индейца", коих недостаточно для нормальной работы. Необходимо доустановить основной пакет httpd - зачем так сделано, решительно непонятно.

dnf install httpd

Основные правки конфига Apache заключаются в установке директивы AllowOverride All для директории /var/www, после чего можно удалить или закомментировать ее в /var/www/html (файл /etc/httpd/conf/httpd.conf). Моя небольшая самодеятельность - создание подкаталога sites-available для хранения конфигураций виртуальных серверов и соответствующая добавка к httpd.conf:

# Load config files in the "/etc/httpd/sites-available" directory, if any.
IncludeOptional sites-available/*.conf

А также создание виртуального сервера по умолчанию, чтобы хотя бы часть проектов можно было разместить в субдиректориях - /etc/httpd/sites-available/000-default.conf:

<VirtualHost *:80>
    DocumentRoot /var/www/html
</VirtualHost>

Напоминает настройки в Ubuntu, но там обычно еще заморачиваются с симлинками в sites-enabled, с чем лично мне возиться совершенно не хочется. Слегка внезапно Apache теперь взаимодействует с php-fpm (через mod_proxy_fcgi), причем конфиг /etc/php-fpm.d/www.conf уже под это заточен (в частности настроен пользователь apache и прослушивание сокета).

Не забываем про владельца файлов и firewalld:

chown -R apache:apache /var/www
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
systemctl enable --now httpd

Вообще поскольку apache - системный пользователь, получается над проектами надо работать под root, а потом менять владельца (чему git будет несказанно "рад"), либо настраивать доступ по FTP. Или же менять пользователя Апача и FPM (я так иногда делаю в виртуальных машинах).

ProFTPd

Собственно настроим этот самый доступ с помощью традиционного FTP-сервера.

dnf install proftpd-utils

Однако его нельзя просто так взять и установить - возникает ошибка nothing provides libmemcached.so.11()(64bit) needed by proftpd. Так что включаем очередной репозиторий (CodeReady Builder) и устанавливаем libmemcached-awesome:

dnf --enablerepo=ol9_codeready_builder install libmemcached-awesome

После этого proftpd-utils (а вместе с ними и сам proftpd) должны установиться.

Нашей целью является сопоставление системного пользователя apache с пользователем FTP, чтобы файлы и каталоги имели правильного владельца. Получаем сведения:

[root@servpc ~]# id apache
uid=48(apache) gid=48(apache) groups=48(apache)

Подставляем полученные данные в команды создания FTP-пользователя и группы www-data (в стиле Ubuntu):

ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=www-data --uid=48 --gid=48 --home=/var/www --shell=/bin/false
ftpasswd --group --file=/etc/proftpd/ftpd.group --name=www-data --gid=48 --member=www-data

Первая команда запрашивает пароль интерактивно.

Правим конфиг /etc/proftpd.conf. Я закомментировал изначальные AuthPAMConfig и AuthOrder и добавил свой:

#AuthPAMConfig                  proftpd
#AuthOrder                      mod_auth_pam.c* mod_auth_unix.c
AuthOrder                       mod_auth_file.c

И в секцию <Global> добавил:

  AuthUserFile          /etc/proftpd/ftpd.passwd
  AuthGroupFile         /etc/proftpd/ftpd.group
  RequireValidShell     off

Как обычно, стартуем и открываем порт. С настройкой пассивного режима я обычно не заморачиваюсь.

systemctl enable --now proftpd
firewall-cmd --permanent --add-service=ftp
firewall-cmd --reload

nut-cgi

Настроим обещанный ранее веб-интерфейс для управления бесперебойником.

dnf install nut-cgi

Появится каталог /var/www/nut-cgi-bin с несколькими скриптами, которые пока что недоступны веб-серверу. Чтобы это исправить, настроим алиас с помощью файла конфигурации /etc/httpd/conf.d/ups.conf:

<IfModule alias_module>
    ScriptAlias /nut-cgi-bin/ "/var/www/nut-cgi-bin/"
</IfModule>

<Directory "/var/www/nut-cgi-bin">
    AllowOverride None
    Options None
    Require all granted

    <Files upsset.cgi>
       deny from all
       allow from 192.168.1
    </Files>
</Directory>

Справедливости ради, этот файл перекочевал еще с CentOS. Для актуальных версий Apache можно было бы использовать более современный синтаксис, но лень. sorry

Далее, добавляем строку в /etc/ups/hosts.conf:

MONITOR EATON5E@localhost "EATON 5E"

А в /etc/ups/upsset.conf раскомментируем:

I_HAVE_SECURED_MY_CGI_DIRECTORY

И поменяем права доступа к этому файлу (604 или 644) или владельца (apache). Поскольку изначально права 600, а владелец nut:root, веб-сервер (а точнее даже запущенный под ним cgi-скрипт) не может прочитать этот файл.

После (пере)запуска httpd можем открывать эти cgi непосредственно:

http://192.168.1.2/nut-cgi-bin/upsstats.cgi
http://192.168.1.2/nut-cgi-bin/upsset.cgi

Но я сделал более хитро - скопировал из Ubuntu /usr/share/nut/www в наш /var/www/html/nut и исправил пути к скриптам в header.html - cgi-bin/nut на nut-cgi-bin. Таким образом, теперь могу открывать http://192.168.1.2/nut/

MariaDB

Которая вроде как более характерна для CentOS/RHEL и заменяет MySQL в нашем квартете. "Крайней" LTS-версией на момент настройки была 10.11, ее и установил.

Если быть точнее: сайт MariaDB, Download, вкладка MariaDB Server Repositories, выбираем Red Hat Enterprise Linux 9 (хотя теоретически может подойти и CentOS Stream), указываем версию (повторюсь – LTS у нас 10.11 на момент написания) и выбираем зеркало (у меня по умолчанию выбирается docker.ru).

В соответствии с выбранными настройками создать (копировать – вставить) файл репозитория /etc/yum.repos.d/MariaDB.repo, например:

# MariaDB 10.11 RedHatEnterpriseLinux repository list - created 2023-03-26 07:18 UTC
# https://mariadb.org/download/
[mariadb]
name = MariaDB
# rpm.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details.
# baseurl = https://rpm.mariadb.org/10.11/rhel/$releasever/$basearch
baseurl = https://mirror.docker.ru/mariadb/yum/10.11/rhel/$releasever/$basearch
# gpgkey= https://rpm.mariadb.org/RPM-GPG-KEY-MariaDB
gpgkey=https://mirror.docker.ru/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1

Как ни странно, со всеми этими $releasever/$basearch все работает - устанавливаем, стартуем, защищаем:

dnf install MariaDB-server MariaDB-client
systemctl enable --now mariadb
mariadb-secure-installation

Первоначально пароль root пустой, Enter. Переключаемся на аутентификацию через сокеты, пароль root не меняем, удаляем анонимуса, запрещаем удаленный логин рута, удаляем тестовую БД и перезагружаем таблицу привилегий.

Вообще говоря в CentOS я заморочился с подтомом btrfs, а в OL9 бессовестным образом забил. Отличие в том, что после установки я сделал старт/стоп сервиса и переименовал /var/lib/mysql. Затем создал подтом и установил владельца:

btrfs subvolume create /var/lib/mysql
chown mysql:mysql /var/lib/mysql

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

phpMyAdmin

На всякий случай установил и его тоже. Благодаря FTP исходники можно залить с его помощью в html/phpmyadmin. Открываем http://192.168.1.2/phpmyadmin/setup/ и номинально (или, по желанию, полноценно - но лично я предпочитаю дорабатывать конфигурацию вручную) добавляем сервер, чтобы получить конфигурационный файл. Если вдруг там предустановлен пользователь root, я бы это дело убрал и наоборот, запретил доступ под ним:

$cfg['Servers'][$i]['user'] = '';
$cfg['Servers'][$i]['AllowRoot'] = false;

Настроим хранилище для phpMyAdmin, для этого создадим соответствующую БД:

mysql < /var/www/html/phpmyadmin/sql/create_tables.sql

Затем создадим соответствующего пользователя (вместо secure_password надо конечно же сгенерировать нормальный) и назначим ему привлегии в соответствии с закомментированным фрагментом из файла create_tables.sql:

CREATE USER pma@localhost IDENTIFIED BY 'secure_password';
GRANT SELECT, INSERT, DELETE, UPDATE, ALTER ON `phpmyadmin`.* TO pma@localhost;
FLUSH PRIVILEGES;

Добавляем этого пользователя в config.inc.php для первого сервера:

$cfg['Servers'][$i]['controluser'] = 'pma';
$cfg['Servers'][$i]['controlpass'] = 'secure_password';

И еще один небольшой штрих к настройке - лично меня бесит разбиение на страницы, поэтому я добавляю в конец заведомо большое значение параметра:

$cfg['MaxNavigationItems'] = 500;

Заливаем файл на сервер, если этого еще не было сделано. В принципе полагается защитить установку путем установки прав 660 на config.inc.php, удаления "лишних" директорий типа test и setup и т.д. и т.п., но не думаю, что на домашнем сервере это имеет значение. А на боевом этот ваш phpMyAdmin и не нужон! acute

Заключение

Итак, базово домашний сервер настроен - корректно выключается при разряде бесперебойника, файлы расшаривает, торренты качает, медиасервер и веб-сервер крутит и даже в распределенных вычислениях участвует. Кстати одним из преимуществом RHEL'ов над Ubuntu'ами является более длительный срок поддержки - теоретически "девятку" можно поставить и "забыть" года этак до 2032-го.

Перечитывая свои прежние статьи про домашний сервер, я с некоторым удивлением заметил, насколько изменился мой подход к его настройке и использованию. Начав с GUI и Webmin, я от них полностью отказался в пользу консоли. Доставшийся в наследство от Windows NTFS сменился ext4, потом LVM + ext4, и наконец btrfs. Всякого рода облачной синхронизацией, как это было описано в статье про Ubuntu 18.04, я очень ограниченно пользуюсь на VDS/VPS (кстати rclone рулит), а дома она так и не прижилась. Как и DLNA с кодированием видео - первый в принципе оказался невостребованным, а второе намного быстрее осуществить на основном компьютере.

Более-менее неизменной остается база, как я ее назвал чуть раньше, хотя веб-сервер с "железного" скорее всего надо менять на Docker, к тому же PostgreSQL постепенно вытесняет MySQL/MariaDB. И еще есть отдельная обширная тема бэкапа без использования Самбы, которая уязвима для вирусов-шифровальщиков. Это, забегая вперед, Restic и отчасти Syncthing - возможно как-нибудь об этом напишу (собирался еще в 2021 году в обзоре Toshiba L200).


Категория: Обзоры софта | Опубликовано 06.04.2023 | Редакция от 08.06.2025

Похожие материалы

Настройка Ubuntu Server 18.04 на домашнем сервере

Или, если угодно, настройка 14.04 часть 2 - кое-какие моменты за прошедшее время не претерпели особых изменений. Статья все же будет носить более технический характер: затронем настройку Samba из консоли, веб-сервера, облачной синхронизации и др.


Комментарии, обсуждение