Oracle Linux на домашнем сервере
домашний сервер Samba linux torrent UPS VirtualBox LAMP ProFTPD BOINC Emby btrfs Oracle Linux OL9
Однако прежде чем я установил 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
Согласно моим заметкам (давно уже было дело ), физические тома высвобождаются "с конца" и
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), так что главное ввести основной репозиторий. Скриншот с виртуалки:
Несмотря на то, что мастер установки по умолчанию предлагает русский язык, я все же предпочитаю английский.
Настройка ОС
В отличие от 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. Честно говоря, не уверен, что последний из них нужен , поскольку изначально такого каталога нет, а судя по датам он тянется еще из 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 можно было бы использовать более современный синтаксис, но лень.
Далее, добавляем строку в /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 и не нужон!
Заключение
Итак, базово домашний сервер настроен - корректно выключается при разряде бесперебойника, файлы расшаривает, торренты качает, медиасервер и веб-сервер крутит и даже в распределенных вычислениях участвует. Кстати одним из преимуществом 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 из консоли, веб-сервера, облачной синхронизации и др.