Главная
ПОЛУЧИТЕ СВОЮ БЕСПЛАТНУЮ КОНСУЛЬТАЦИЮ
Системный администратор
Виртуализация

Быстро и качественно
Предоставляемые услуги
Обслуживание компьютеров
Создание WEB сервера
Сборка и ремонт ПК
Обслуживание серверов
Системы хранения
Объединение офисов
Системное администрирование
Регистрация доменного имени
Настройка IP телефонии
Мои реализованные проекты
Установка и настройка Nextcloud + Apache на Ubuntu Server
Подготовка к установке Прежде чем перейти к установке и настройке компонентов nextcloud, выполним предварительные действия. Системные требования С актуальными системными требованиями можно ознакомиться на странице System requirements. Необходимо убедиться, что наш сервер соответствует данным требованиям. Особое внимание нужно уделить программным требованиям, а именно: Дистрибутиву и версии операционной системы. СУБД. Вариантам веб-сервера. Версии PHP. Мы можем выбрать из вариантов версий и компонентов, но разработчики рекомендуют остановить свой выбор на конкретных пунктах, которые они выделили полужирным и сделали отметку (recommended). На момент обновления данной инструкции актуальная версия Nextcloud была 31 (Hub 10) с рекомендованными требованиями: Ubuntu 24.04 LTS. MariaDB 10.11. Apache 2.4. PHP 8.3. Именно эти компоненты и будут использоваться в данной инструкции. Настройка времени Чтобы мы могли видеть правильную метку времени создания и изменения файлов, необходимо, чтобы время было корректным на сервере. Устанавливаем утилиту chrony: apt install chrony … и запускаем ее: systemctl enable chrony Выставляем нужный часовой пояс: timedatectl set-timezone Europe/Moscow * в данном примере московское время. Брандмауэр По умолчанию в Ubuntu не требуется открывать порты, так как брандмауэр разрешает все. Но если в вашем случае действует запрещающая политика, открываем веб-порты 80 и 443: iptables -I INPUT -p tcp —dport 80 -j ACCEPT iptables -I INPUT -p tcp —dport 443 -j ACCEPT Для сохранения правил используем iptables-persistent: apt install iptables-persistent netfilter-persistent save Сервер баз данных В качестве СУБД будем использовать MariaDB. Устанавливаем: apt install mariadb-server-10.11 * обратите внимание, что мы устанавливаем конкретную версию (10.11). Дело в том, что в репозитории MariaDB может быть версия свежее той, что требуется для Nextcloud. В результате мы получим ошибку, когда перейдем к установке портала. Поэтому мы берем саму последнюю версию из системных требований и подставляем ее при установке. Если во время установки нужной версии mariadb система вернет ошибку: Для пакета «mariadb-server» не найден кандидат на установку … необходимо подключить репозиторий. Для этого прочитайте раздел Подключение актуального репозитория инструкции Установка MariaDB-server на Rocky Linux или Ubuntu. Подключаемся к MariaDB и создаем базу данных: mysql > CREATE DATABASE nextcloud DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; Создаем пользователя и даем ему привилелении на созданную базу: > CREATE USER ‘nextcloud’@’localhost’ IDENTIFIED BY ‘nextcloud’; > GRANT ALL PRIVILEGES ON nextcloud.* TO nextcloud@localhost; Выходим из оболочки SQL: > quit Веб-сервер + PHP Как было сказано выше, для Nextcloud необходим веб-сервер. Само приложение написано на языке PHP и также требуется одноименный интерпретатор. Apache Nextcloud можно развернуть на NGINX или Apache. В данной инструкции будем использовать последний. Устанавливаем веб-сервер: apt install apache2 Создаем виртуальный домен и настраиваем его для работы с облачным сервисом: vi /etc/apache2/sites-enabled/nextcloud.conf <VirtualHost *:80> Define root_domain nextcloud.oleg.ru ServerName ${root_domain} Redirect / https://${root_domain}/ </VirtualHost> <VirtualHost *:443> Define root_domain nextcloud.oleg.ru Define root_path /var/www/nextcloud ServerName ${root_domain} DocumentRoot ${root_path} SSLEngine on SSLCertificateFile ssl/cert.pem SSLCertificateKeyFile ssl/cert.key <IfModule mod_headers.c> Header always set Strict-Transport-Security «max-age=15552000; includeSubDomains; preload» </IfModule> <Directory ${root_path}> AllowOverride All Require all granted </Directory> </VirtualHost> * где: nextcloud.oleg.ru — домен, на котором будет работать сервис. ssl/cert.pem — открытый сертификат. Его мы создадим ниже по инструкции. ssl/cert.key — путь до ключа закрытого сертификата. Его мы создадим ниже по инструкции. /var/www/nextcloud — каталог с порталом. В него мы распакуем исходники. Разрешаем модули: a2enmod ssl rewrite headers env dir mime * где: ssl — поддержка шифрования. rewrite — модуль, позволяющий выполнять перенаправления на уровне apache. headers — позволяет менять заголовки при http-ответах. env — управление системными переменными, которые используются другими модулями Apache. dir — для поиска скрипта по умолчанию и отображения файлов в каталоге. mime — назначает метаданные при ответах. Создаем каталог для хранения сертификатов и переходим в него: mkdir /etc/apache2/ssl cd /etc/apache2/ssl Генерируем сертификат: openssl req -new -x509 -days 1461 -nodes -out cert.pem -keyout cert.key -subj «/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=nextcloud.oleg.ru/CN=nextcloud» * данная команда создаст сертификат на 4 года для URL nextcloud.oleg.ru или nextcloud. Для первичного запуска Nextcloud достаточно самоподписанного сертификата. Однако, для продуктивной среду лучше его купить или запросить бесплатный у Let’s Encrypt. Проверяем конфигурацию apache: apachectl configtest … если видим: … Syntax OK * мы увидим предупреждение Warning: DocumentRoot [/var/www/nextcloud] does not exist. Оно означает, что каталога /var/www/nextcloud не существует. Игнорируем — мы созданим его позже. Перезапускаем сервис апача: systemctl restart apache2 PHP На момент последнего обновления инструкции, рекомендовалось установить PHP версии 8.3. Для дальнейшего удобства работы, мы сохраним ее в переменную: export PHP_VER=8.3 Посмотреть, какая версия будет установлена из репозитория системы можно командой: apt search —names-only ‘^php[.0-9]{3}$’ а) Если она соответствует рекомендации Nextcloud, вводим команду для установки PHP, PHP-FPM и необходимых расширений: apt install php php-fpm php-common php-zip php-xml php-intl php-gd php-mysql php-mbstring php-curl php-imagick libapache2-mod-fcgid php-gmp php-bcmath libmagickcore-6.q16-6-extra б) Если рекомендованной PHP версии в репозитории нет, переходим к инструкции Установка разных версий PHP на Linux Ubuntu. Устанавливаем PHP нужной версии, а после расширения: apt install php${PHP_VER}-fpm php${PHP_VER}-common php${PHP_VER}-zip php${PHP_VER}-xml php${PHP_VER}-intl php${PHP_VER}-gd php${PHP_VER}-mysql php${PHP_VER}-mbstring php${PHP_VER}-curl php${PHP_VER}-imagick libapache2-mod-fcgid php${PHP_VER}-gmp php${PHP_VER}-bcmath libmagickcore-6.q16-6-extra После установки PHP и расширений, выполним несколько настроек. Разрешаем в Apache модули для fcgi и php-fpm: a2enmod proxy_fcgi setenvif a2enconf php${PHP_VER}-fpm Настраиваем php.ini: vi /etc/php/${PHP_VER}/fpm/php.ini opcache.enable_cli=1 … opcache.interned_strings_buffer=32 … opcache.revalidate_freq=1 … memory_limit = 512M * где ${PHP_VER} в пути в файлу — версия установленного PHP. Посмотреть версию PHP можно командой: php -v Перезапускаем Apache и php-fpm: systemctl restart apache2 php${PHP_VER}-fpm Установка Nextcloud Устанавливаем дополнительные пакеты: apt install wget unzip где: wget — для загрузки файлов. unzip — для распаковки архива. Переходим во временную папку: cd /tmp и скачиваем исходник для установки с последней версией портала: wget https://download.nextcloud.com/server/releases/latest.zip * при необходимости скачать другую версию Nextcloud, переходим по ссылке download.nextcloud.com/server/releases. Распаковываем скачанный архив: unzip latest.zip * если мы загрузили не последнюю версию nextcloud, то имя файла будет другим. И переносим содержимое архива в каталог /var/www: mv nextcloud /var/www Задаем права доступа: chown -R www-data:www-data /var/www/nextcloud Открываем браузер и переходим по адресу https://nextcloud.oleg.ru, где nextcloud.oleg.ru — адрес облачного сервиса, который мы прописали в настройках apache. Задаем логин и пароль для администратора. В качестве базы данных выбираем MySQL/MariaDB (если предлагается выбор) и вводим в качестве логина, пароля и базы nextcloud. Завершаем установку. Оптимизируем работу базы данных: sudo -u www-data php /var/www/nextcloud/occ db:convert-filecache-bigint sudo -u www-data php /var/www/nextcloud/occ db:add-missing-indices Открываем конфигурационный файл nextcloud: vi /var/www/nextcloud/config/config.php Добавляем: … ‘default_phone_region’ => ‘RU’, Настройка кэширования В общих сведениях настроек nextcloud мы получим предупреждение, если не настроим кэширование. Сначала устанавливаем memcached и php-apcu: apt install memcached php-memcached php-apcu Если мы устанавливали не нативную версию PHP, то наша команда будет: apt install memcached php${PHP_VER}-memcached php${PHP_VER}-apcu После разрешаем автозапуск и запускаем сервис кэширования: systemctl enable memcached systemctl start memcached Перезапускаем apache: systemctl restart apache2 Отредактируем конфигурационный файл nextcloud: vi /var/www/nextcloud/config/config.php Добавляем: … ‘filelocking.enabled’ => true, ‘memcache.locking’ => ‘\\OC\\Memcache\\Memcached’, ‘memcache.local’ => ‘\OC\Memcache\Memcached’, ‘memcache.distributed’ => ‘\OC\Memcache\Memcached’, ‘memcached_servers’ => [ [ ‘127.0.0.1’, 11211 ], ], … Выполнение фоновых заданий в cron После установки Nextcloud фоновые задания выполняются с помощью AJAX при посещении страниц пользователем. Это не позволит выполнять задачи планировщика при отсутствии активности. Для решения проблемы переходим в настройки: Кликаем по Основные параметры: В разделе «Фоновые задания» выбираем Cron: Идем в консполь,устанавливаем cron: apt install cron Cоздаем задание от пользователя www-data: crontab -e -uwww-data */5 * * * * /usr/bin/php /var/www/nextcloud/cron.php * в нашем примере каждые 5 минут будет запускаться скрипт cron.php из каталога nextcloud. Для ресурсоемких ежедневных фоновых задач нужно выставить окно обслуживания. Это делается командами: sudo -u www-data php /var/www/nextcloud/occ config:app:set core backgroundjobs_mode —value=»cron» sudo -u www-data php /var/www/nextcloud/occ config:system:set maintenance_window_start —type=integer —value=2 * в данном примере разрешено выполнить обслуживание, начиная с 02:00. Тюнинг после установки Для корректной работы системы выполним дополнительную настройку. После входа в nextcloud под администратором, переходим в настройки для пользователя: В разделе «Параметры сервера» переходим в Основные сведения: В разделе «Проверка безопасности и параметров» мы можем увидеть список проблем: Рассмотрим процесс решения некоторых из них. 1. Не указан регион размещения этого сервера Nextcloud Для решения проблемы открываем конфигурационный файл nextcloud: vi /var/www/nextcloud/config/config.php Добавляем: … ‘default_phone_region’ => ‘RU’, Работа с большими файлами При попытке загрузить файлы большого объема, мы можем столкнуться с проблемами. Рассмотрим процесс настройки сервера, чтобы этого избежать. Открываем конфигурационный файл PHP: vi /etc/php/${PHP_VER}/fpm/php.ini Приводим следующие опции к виду: upload_max_filesize = 512G … post_max_size = 512G … max_execution_time = 3600 … max_input_time = 3600 … output_buffering = 0 * где: upload_max_filesize — максимально допустимый размер одного загружаемого файла; post_max_size — максимальный объем отправляемых на сервер данных; max_execution_time — максимальное время работы скрипта. В данном примере, если он не успеет отработать за 3600 секунд, PHP принудительно завершит его работу max_input_time — время в секундах, за которое PHP должен разобрать входные данные GET и POST. output_buffering — ограничение буферизации вывода для всех файлов. В нашем примере отключаем. Перезапускаем апач: systemctl restart apache2 Задаем новое значение фрагментации загружаемых файлов: sudo -u www-data php /var/www/nextcloud/occ config:app:set files max_chunk_size —value 536870912 * задано значение в 50 Мб. Некоторые полезные приложения В данном разделе рассмотрим некоторые приложения, которые могут оказаться полезными и расширят возможности Nextcloud. 1. Офисные пакеты У нас есть возможность редактировать офисные документы (на подобие doc и xls) онлайн, не мешая нескольким сотрудникам работать с одними и теми же файлами одновременно. Для расширения функциональной возможности используются специальные приложения. Наиболее распространенные: 1. Collabora Office. 2. OnlyOffice. Работа данных приложений требует настройки специализированного сервера. Инструкции по настройке представленны по ссылками выше. 2. Антивирус Для защиты данных от вирусов можно использовать приложение «Antivirus for files». Его работа основана на антивирусе ClamAV. Сначала в систему нужно установить его: apt install clamav clamav-daemon Так как обновления clamav заблокированы для российских IP-адресов, открываем файл: vi /etc/clamav/freshclam.conf Комментируем строки, которые начинаются на ##DatabaseMirror ##DatabaseMirror … ##DatabaseMirror … Добавляем строку: PrivateMirror https://packages.microsoft.com/clamav/ Останавливаем службу clamav-freshclam: systemctl stop clamav-freshclam Удаляем старую информацию об обновлениях: rm -f /var/lib/clamav/freshclam.dat Запускаем обновление: freshclam Ждем обновления, после перезапускаем службы clamav-freshclam и clamav-daemon: systemctl restart clamav-freshclam clamav-daemon Само приложение Antivirus for files можно установить из командной строки: sudo -u www-data php /var/www/nextcloud/occ app:install files_antivirus Теперь переходим в веб-интерфейс Nextcloud и в параметрах сервера кликаем по Безопасность: В разделе «Антивирус для Файлов» выставляем необходимые настройки: * в моем примере проверка выполняется при обращении к службе clamav. Также мы предпочли сразу удалять зараженный файл (на выбор также предлагается просто записывать событие в журнал). Работа с пользователями из UNIX-Shell В состав nextcloud входит php-скрипт occ, с помощью которого можно управлять сервисом из командной строки Linux. Добавление пользователя Создать нового пользователя можно командой: sudo -u www-data php /var/www/nextcloud/occ user:add admin * где admin — имя учетной записи. Сброс пароля При необходимости сбросить пароль пользователя, можно воспользоваться командой: sudo -u www-data php /var/www/nextcloud/occ user:resetpassword admin * где admin — учетная запись пользователя, чей пароль хотим сбросить. Дополнительные настройки Рассмотрим некоторые дополнительные настройки в Nextcloud. 1. Опция skeletondirectory Эта настройка позволяет задать шаблон папок и файлов, которые автоматически создаются в новом аккаунте пользователя. Например, можно добавить стандартные папки Документы, Шаблоны или файлы-инструкции. Skeletondirectory удобен для корпоративных развертываний, где нужно единообразие структуры данных. Файлы из этой папки копируются при первом входе пользователя. Опция экономит время на ручное создание общих папок и помогает поддерживать порядок в файловом хранилище. Однако, если нам не нужна данная возможность, лучше в конфигурации задать опцию: vi /var/www/nextcloud/config/config.php ‘skeletondirectory’ => », В противном случае, будут копироваться стандартные шаблоны, которые, как правило, не нужны пользователю. Данное действие немного сэкономит дискового пространства. 2. Автоматическая чистка корзины В конфигурации nextcloud есть опция trashbin_retention_obligation, которая определяет обязательный срок хранения файлов в корзине перед их автоматическим удалением. Настройка помогает соблюдать политики хранения данных и избежать случайной потери информации. Пример настройки: vi /var/www/nextcloud/config/config.php ‘trashbin_retention_obligation’ => ’90,auto’, * в данном примере Nextcloud не сможет удалить файлы из корзины, пока не пройдет 90 дней с момент их удаления. Все варианты настроек автоочистки корзины подробно описаны на официальном сайте. Настройка логирования Нам может понадобиться включить лог для диагностики и решения проблем. Для этого открываем конфигурационный файл: vi /var/www/nextcloud/config/config.php Добавим: … ‘log_type’ => ‘file’, ‘logfile’ => ‘nextcloud.log’, ‘loglevel’ => 3, ‘logdateformat’ => ‘F d, Y H:i:s’, Готово, увидеть лог можно командой: tail -f /var/www/nextcloud/nextcloud.log Возможные проблемы Превышено количество запросов На странице аутентификации мы можем увидеть сообщение об ошибке Превышено количество запросов. При этом, мы не можев войти в систему. Причина: в Nextcloud встроена система безопасноти, которая считает количество неудачных попыток входа в систему. Если для определенного адреса данное количество превысило допустимую норму, то облако будет блокировать вход в систему на некоторое время для защиты от взлома. Решение: данные о неудачных попытках подключиться к Nextcloud хранятся в базе данных, таблице oc_bruteforce_attempts. В нашем примере мы использовали базу MySQL. Подключимся к ней: mysql -uroot -p Выберем для работы базу nextcloud: > use nextcloud Вывести список всех неудачных попыток можно командой: > select * from oc_bruteforce_attempts; На его основе можно попробовать сделать выводы, откуда приходят попытки выторизоваться и под каким пользователем идут попытки входа в систему. Это могут быть целенаправленные попытки взломать систему, или у пользователя может быть изменен пароль, а приложение, установленное на компьютер делает попытки подключения со старыми аутентификационными данными. Чтобы быстро решить проблему, мы можем почистить таблицу командой: > truncate oc_bruteforce_attempts;
Как подключиться по SSH к WSL 2 в Windows 10 с внешнего компьютера
Шаг 1. Установить сервер OpenSSH в дистрибутиве WSL 2 sudo apt install openssh-server Шаг 2. Настроить сервер OpenSSH в дистрибутиве WSL 2 Все настройки расположены в конфигурационном файле /etc/ssh/sshd_config. SSH обычно эксплуатирует 22 порт, я предпочитаю использовать 2222, его легко запомнить и он отличается от аналогичного порта на «материнской» Windows-машине. Если указано 0.0.0.0 — то подразумевается подключение с любого IP. Если аутентификация будет проходить по паролю (лично мне не захотелось в этом случае заморачиваться с настройкой пары ключей), тогда нужно указать yes в строке с PasswordAuthentication. В итоге сам сервис надо запустить. service ssh start Шаг 3. Проброс порта в WSL 2 В WSL 2 имеется виртуализированный адаптер Ethernet с собственным уникальным IP-адресом. Узнать его можно по команде из под WSL — ip addr. Ниже приводится пример команды PowerShell (запускать с административными правами), которая добавляет прокси-сервер портов, ожидающий передачи данных на порту узла 2222 и перенаправляющий все подключения на порт 2222 виртуальной машины WSL 2 с IP-адресом 172.25.35.235 netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=2222 connectaddress=172.25.35.235 connectport=2222 Все записи прокси-сервера можно посмотреть по команде: netsh interface portproxy show v4tov4 Их можно все удалить с помощью: netsh int portproxy reset all Шаг 3. Создание правила в брандмауэре Windows 10 В данном случае опять запускать PowerShell от имени администратора. netsh advfirewall firewall add rule name=”Open Port 2222 for WSL2” dir=in action=allow protocol=TCP localport=2222 Шаг 4. Проверяем SSH-соединение с WSL 2 Сперва пробуем подключиться к WSL 2 из под «материнской» Windows (подразумевается что это 10-ка и стоит SSH-клиент). С WSL у меня уже настроена пара ключей, так что запроса пароля не последует. ssh -p 2222 ваш_логин_wsl@172.25.35.235 Теперь попробуем подключиться со сторонней Linux-машины, в данном случае я уже обращаюсь не к виртуальному IP-адресу WSL, а к локальному адресу «материнской» Windows-машины, который у меня 192.168.0.4 ssh -p 2222 ваш_логин_wsl@192.168.0.4 Так как для стороннего компьютера у меня не настроен доступ по ключу, поэтому придется ввести пароль от WSL. Сразу оговорюсь, если используется такой метод подключения в Shell-скриптинге, то проще и безопаснее настроить пару ключей, также для ввода ключа можно перейти в интерактивный режим (expect) или использовать утилиту sshpass, что я и сделал. sudo apt install sshpass Теперь можно подключиться в одну строчку так: sshpass -p ваш_пароль_wsl ssh -p 2222 ваш_логин_wsl@192.168.0.4
Bitrix on Debian 12 with ISPConfig
Возможности быстрая установка на чистую ОС Debian 12 удобная и интуитивно понятная панель ISPConfig возможность настройки трассировки медленных запросов (php-fpm) почта работает «из коробки», Google Mail, Яндекс Почта, mail.ru получают письма без пометки Спам создание нескольких сайтов на одном сервере разделение пользователей автоматизация получения сертификатов для доменов поддержка нескольких версий php на одном сервере для разных сайтов улучшенная безопасность. Если злоумышленник взломает один из сайтов, он не сможет получить доступ к сайтам других пользователей. Установка Ispconfig cd /root/ wget https://raw.githubusercontent.com/Wladimir-N/ispconfig/debian12/ispconfig-debian12.sh chmod +x ispconfig-debian12.sh ./ispconfig-debian12.sh запускать скрипт под рутом ставить на чистую систему! именно классическая авторизация под root либо su - либо sudo -i директория /root/ispconfig системная и используется при установке, соответственно до запуска скрипта установки не должна существовать т.е. такой вариант установки если находимся в /root/ некорректен — git clone https://github.com/Wladimir-N/ispconfig.git && cd ./ispconfig && … логи установки смотрим в /root/ISPConfig.log креды для доступа в ISPConfig смотреть в /root/.ispconfig.ini — первая строчка admin и пароль соответственно root пароль MySQL — вторая строчка в /root/.ispconfig.ini Настройка для работы в ISPConfig используется порт 81 для посещаемых сайтов можно увеличить количество php воркеров (опция PHP-FPM pm.max_children) Настройка сайта на движке Битрикс заходим в панель, создаём сайт и в закладке Options копируем из файла https://github.com/Wladimir-N/ispconfig/blob/debian12/Bitrix настройки PHP (опция Custom php.ini settings) и nginx (опция nginx Directives) Настройка MySQL если железо одинаковое и сайт преезжает с BitrixVM для начала можно скопировать файл bvat.cnf с BitrixVM в каталог /etc/mysql/mariadb.conf.d/, но переименовать, например, в 90-my.cnf после суток работы установить запустить Mysql тюнер и поправить настройки согласно рекомендациям apt install mysqltuner mysqltuner Установка и настройка необходимых модулей по необходимости доставим в систему утилиты и модули (к примеру) apt install mc apt install php8.2-memcache правки можно вносить в конец файла /etc/mysql/mariadb.conf.d/51-server.cnf установка sphinxsearch sudo apt-get install sphinxsearch берём конфиг sphinx из админки битрикса, удаляем строчку infix_fields= этот конфиг добавляем к дефолтному /etc/sphinxsearch/ правим /etc/default/sphinxsearch на предмет set START=yes sudo service sphinxsearch start установка composer apt install --no-install-recommends composer Настройка логирования трассировок медленных запросов Для настройки логирования трассировок медленных запросов читаем php-slow-log.txt Смена версии PHP Для установки доп.версий PHP используем скрипт https://raw.githubusercontent.com/Wladimir-N/ispconfig/debian12/autoinstall.sh по результату добавления нужной PHP версии в консоль выведет параметры которые прописываем в ISPConfig — Setting — Additional PHP Versions далее в настройках сайта выбираем эту версию Почта Используется почтовый сервер postfix Почта работает «из коробки», Google Mail, Яндекс Почта, mail.ru получают письма без пометки Спам. Очередь сообщений можно глянуть в ISPConfig — Monitor — Mail Queue Там же рядом логи ISPConfig — Monitor — Mail log Настройка сайтов для работы с одним ядром Bitrix работаем root пользователем: у пользователя под которым работает второй сайт в /etc/passwd меняем id пользователя и группы на те-же, что у первого сайта например, было web1:x:5004:5005:…. web2:x:5005:5005:…. меняем web2:x:5005:5005:…. -> web2:x:5004:5005:…. переходим в домашнюю папку пользователя web2 — меняем владельца cd /var/www/clients/client0/web2 find . -user 5005 -exec chown 5004:5005 {} + логинимся вторым пользователем su - web2 -s /bin/bash создаем симлинки на папки /upload/ и /bitrix/ cd /var/www/clients/client0/web2/web ln -s /var/www/clients/client0/web1/web/upload . ln -s /var/www/clients/client0/web1/web/bitrix . Для корректной работы обоих сайтов хранение сессий рекомендуется сделать в БД https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=14026 т.к. у сайтов разные темп директории, соответственно если хранить в файлах то надо приводить всё в одну, чтобы не кастомизировать проще перейти в БД Возможные проблемы и их решения Применяю настройки в ISPConfig — по факту ничего не изменяется При этом в правом верхнем углу ISPConfig наблюдаются красный кружок в цифрой — это не применённые изменения Проблема вероятно из-за php 8.3 по умолчанию в ОС, решение: update-alternatives --config php выбираем php 8.2 ждем более 1 минуты (изменения ISPConfig применяются раз в минуту) — должно работать Не корректно запускается cron_events.php Скорее всего в php.ini не включена опция short_open_tag. Можно задать глобально в конфигах /etc/php/ваша версия}/cli/php.ini Рекомендации При создании сайта Если у Вас виртуальный сервер не нужно создавать/использовать клиентов. Создайте сайт под админом. Для корректной работы почты Должны быть прописаны прямая A и обратные записи PRT для домена сервера (не путать с доменом сайта). В том числе и для IPv6! Сервис для проверки работы почты https://www.mail-tester.com/ — отправлять письмо нужно непосредственно с сайта, например в PHP консоли mail()
Оптимизация оперативной памяти в Proxmox
Всем привет!!! В этом материале я поделюсь с вами информацией как оптимизировать ОЗУ в Proxmox ну и заодно эта инструкция будет служить мне шпаргалкой на будущее. У меня дома имеется сервер виртуализации на базе гипервизора Proxmox VE. Сервер построен на энергоэффективном процессоре и 32Г оперативной памяти. Казалось бы ОЗУ предостаточно, так думал и я. Но оказалось, что я могу запустить всего 4 виртуальные машины и эта самая ОЗУ закончится. Причем мои подсчеты показывали, что я не выделял такое количество памяти для моих виртуальных машин. В связи с этим я озадачился оптимизацией ОЗУ для Proxmox. И результаты меня приятно удивили. Вот например на скринах видно результат моей оптимизации ОЗУ для 4-х виртуальных машин. Как видите результат на лицо. Удалось сэкономить около 7-8 ГБ оперативной памяти. Более того, если до оптимизации я не мог запускать более 4-х виртуальных машин, то после я смог запустить 8 без ущерба для сервера и это не предел. до оптимизации после оптимизации Оглавление Оптимизация ZFS кеш Настройка KSM Ballooning (Полет на воздушном шаре) Итог Оптимизация ZFS кеш Все знают, что ZFS очень любит оперативную память, но зачем и для чего задумываются единицы. Я кстати только сейчас, когда делал статью, задумался об этом. А ведь это очень важный аспект в ОС с файловой системой ZFS. ARC (Adaptive Replacement Cache) в ZFS – это эффективный механизм кеширования, который использует сложные алгоритмы для минимизации обращений к диску на чтение. Чем лучше работает ARC и чем больше данных попадает в кеш, тем сложнее избавиться от них. Это приводит к тому, что ZFS обычно использует всю доступную память под ARC. Хотя это может быть полезно, стоит помнить, что память – дорогой ресурс, особенно если используются быстрые SSD или NVMe накопители. В результате можно ограничить использование ZFS кеша, что бы для виртуальных машин было больше ОЗУ, но если у вас жесткие диски, а не SSD, то приготовитесь к снижению отклика производительности в виртуальных машинах при обращении к дискам. Некоторые выбирают btrfs, что бы не испытывать проблем с кешем ZFS, но как по мне лучше отключить кеш вовсе, чем использовать btrfs, которая на данный момент для Proxmox носит тестовый релиз, т.е. разработчики не встроили ее должным образом и еще изучают ее поведение. Для ограничения ZFS кеша создайте такой файл /etc/modprobe.d/zfs.conf nano /etc/modprobe.d/zfs.conf Впишите в него следующие параметры options zfs zfs_arc_min=1073741824 options zfs zfs_arc_max=2147483648 Я ограничил кеш от 1ГБ до 2ГБ. Вы же можете сделать собственные настройки по такой формуле N*1048576*1024. Это связано с тем, что размер кеша указывается в байтах. Значения для настройки: 12 Gb = 12884901888 8 Gb = 8589934592 6 Gb = 6442450944 Теперь нужно обновить образ загрузчика так: update-initramfs -u При использовании UEFI выполните еще такую команду: pve-efiboot-tool refresh Изменения вступят в силу после перезагрузки сервера Proxmox Для отслеживания использования ARC кеша используйте команду arcstat Настройка KSM КSM (Kernel Same-page Merging) – это функция ядра Linux, которая позволяет объединять одинаковые страницы памяти различных процессов для уменьшения потребления ресурсов. Этот процесс можно сравнить с оптимизацией использования оперативной памяти путем удаления дублирующихся данных. При использовании множества однотипных виртуальных машин KSM может значительно уменьшить объем занимаемой памяти. В proxmox служба KSM включена по умолчанию, как и ее настройки. С настройками по умолчанию KSM начинает работать когда на Proxmox остается 20% свободной памяти. Вообще там много настроек, но я буду менять только эту одну. Некоторым может показаться странным, что разработчики выставили такой маленький процент, но у KSM есть другая сторона медали. Дело в том, что процесс дедупликация ОЗУ занимает очень много процессорного времени. По-простому говоря он будет нагружать процессор иногда даже сильнее чем виртуальная машина. Поэтому увеличивать процент, при котором начнет работать KSM слишком много не стоит. Я решил, что для моих не требовательных виртуальных машин, энергоэффективного процессора и размера ОЗУ лучшим вариантом для начала работы KSM будет 30-40 %. Поэтому я установил это значение в 35%. В результате после занятия 20ГБ ОЗУ начнет работать KSM стремясь не дать серверу израсходовать больше этого объема за счет дедупликации оперативной памяти. Для этого нужно отредактировать файл /etc/ksmtuned.conf nano /etc/ksmtuned.conf Раскомментировать строку и заменить на свое значение ее параметр: KSM_THRES_COEF=20 В этом файле есть и другие интересные параметры, более подробно можно почитать в исходниках, ссылки на которые я оставлю в конце статьи. Теперь для применения изменений сделайте рестарт службе KSM (сервер перегружать не нужно): systemctl restart ksmtuned Для отслеживания работы KSM можно воспользоваться командой cat /sys/kernel/mm/ksm/pages_sharing Ballooning (Полет на воздушном шаре) Увеличение объема памяти в KVM позволяет гостевой операционной системе динамически изменять использование памяти путем освобождения неиспользуемых ресурсов во время работы. Это помогает снизить влияние, которое гость может оказывать на использование памяти хоста, возвращая неиспользованную память обратно хосту. Proxmox VE может предоставлять дополнительную память для загруженной виртуальной машины. Сама виртуальная машина принимает решение о том, какие процессы или страницы кэша можно заменить, чтобы освободить память для расширенной виртуальной машины. Виртуальная машина (будь то Windows или Linux) лучше всего знают, какие области памяти можно использовать без ущерба для ее производительности. Необходимым требованием является установка гостевых дополнений: Для Window: Загрузить последнею стабильную версию драйвера в виде ISO образа. Подключите образ как CD-ROM Установите virtio-win-gt-x64 и затем virtio-win-guest-tools Перезагрузите Windows Для Linux: Debian\Ubuntu: apt-get install qemu-guest-agent затем systemctl start qemu-guest-agent Если после перезагрузки не запускается, то выполните эту команду: systemctl enable qemu-guest-agent Теперь когда ваши виртуальные машины готовы для динамического расширения оперативной памяти их нужно настроить. Для этого остановите виртуальную машину и отредактируйте настройки ее ОЗУ. Установите флажок раздуваемой памяти и назначьте минимальное и максимальное значение. После чего включите виртуальную машину и наблюдайте. У каждой виртуальной машины эти параметры могут быть уникальными. В примере выше моя тестовая Windows 11 Итог В результате после всех проделанных изменений и оптимизаций работы оперативной памяти в Proxmox я смог запустить разом все те виртуальные машины, которые до этих изменений не мог даже подумать запускать одновременно. Я молчу сколько я еще смогу запустить виртуальных машин благодаря всего 5-10 минут потраченных на оптимизацию ОЗУ в Proxmox. На картинке ниже видно, что объем занимаемой ОЗУ сейчас 64,35% и равен почти 20ГБ при запущенных 8 виртуальных машинах, в то время как KSM (дедупликация памяти) равен 6,46ГБ. Получается, что практически нет выделения памяти под кеш ZFS, так еще и виртуальные машины стали правильно работать с ОЗУ, а KSM дополнительно экономит порядочно гигабайт. Оказывается 32ГБ оперативной памяти для Proxmox вполне достаточно в моих задачах и не стоит даже думать об апгрейде ОЗУ.
Если у вас есть несколько ядер в вашей системе, вы можете вручную установить, какая версия Kernel начнется:
Если у вас есть несколько ядер в вашей системе, вы можете вручную установить, какая версия Kernel начнется: Перезагрузите компьютер с нажатием Shift кнопка для дисплея GRUB после запуска BIOS. Вы увидите что-то вроде: Выберите «Расширенные опции для Ubuntu» и запомнить индекс этой строки меню(подсчет начинается с 0) На рисунке 1 Выберите конкретное ядро для загрузки, а также запомните индекс этой строки меню (подсчет начинается от 0) На рисунке выбранного ядра 2 Начните систему. Это действие для одного ботинка на ядре бетона. Если вы хотите начать с бетонного ядра все время, вы должны сделать следующие шаги: 4.1. Откройте и отредактируйте файл настройки GRUB: sudo nano /etc/default/grub 4.2. Найти линию GRUB_DEFAULT=...(по умолчанию) GRUB_DEFAULT=0) и устанавливает в кавычки пути меню к конкретному ядру (Запомните индексы меню из шагов 2 и 3). В моей системе первый индекс был 1 и второй был 2. Я ввязался в GRUB_DEFAULT GRUB_DEFAULT="1>2" Сохранить файл. 4.3. Обновление информации GRUB для применения изменений: sudo update-grub 4.4. После перезагрузки вы автоматически загружаете на ядро по выбранному маршруту меню. Пример на моей машине 1 -> 2 4.5. Проверьте версию Kernel после перезагрузки: uname -r
Скрипт для обновления всех контейнеров (к предыдущей статье)
Скрипт для обновления всех контейнеров (Проверенная совместимость: 7.x — 8.3.5) Этот скрипт обновляет все работающие контейнеры Proxmox, пропуская указанные исключенные контейнеры и генерирует отдельный файл журнала для каждого контейнера. Сценарий сначала обновляет систему хостов Proxmox, затем перестраивается через каждый контейнер, обновляет контейнер и при необходимости перезагружает его. Файл журнала каждого контейнера хранится в $log_path, а основной файл журнала скриптов называется container-upgrade-main.log. Установить wget https://raw.githubusercontent.com/Meliox/PVE-mods/main/updateallcontainers.sh Или используйте клон Git. Может быть добавлен в cron для, например, ежемесячного обновления: 0 6 1 * * /root/scripts/updateallcontainers.sh Текст скрипта: #!/bin/bash # This script updates all running Proxmox containers, skipping specified excluded containers, and generates a separate log file for each container. # The script first updates the Proxmox host system, then iterates through each container, updates the container, and reboots it if necessary. # Each container's log file is stored in $log_path and the main script log file is named container-upgrade-main.log. # Path where logs are saved log_path="/root/scripts" # array of container ids to exclude from updates exclude_containers=("106") # path to programs pct="/usr/sbin/pct" # list of container ids we need to iterate through containers=$($pct list | tail -n +2 | cut -f1 -d' ') #### CODE BELOW ######### container_main_log_file="${log_path}/container-upgrade-main.log" echo "[Info] Updating proxmox containers at $(date)" echo "[Info] Updating proxmox containers at $(date)" >> $container_main_log_file #function to update individual containers function update_container() { container=$1 # log file for individual container container_log_file="${log_path}/container-upgrade-$container.log" # log start of update echo "[Info] Starting update for container $container at $(date)" >> $container_log_file # perform the update $pct exec $container -- bash -c "apt update && apt upgrade -y && apt autoremove -y && reboot" >> $container_log_file 2>&1 # log completion of update echo "[Info] Completed update for $container at $(date)" >> $container_log_file echo "--------------------------------------------------------------------------------------------" >> $container_log_file } for container in $containers; do # skip excluded containers if [[ " ${exclude_containers[@]} " =~ " ${container} " ]]; then echo "[Info] Skipping excluded container, $container" echo "[Info] Skipping excluded container, $container" >> $container_main_log_file continue fi status=$($pct status $container) if [ "$status" == "status: stopped" ]; then echo "[Info] Skipping offline container, $container" echo "[Info] Skipping offline container, $container" >> $container_main_log_file elif [ "$status" == "status: running" ]; then update_container $container fi done; wait # log completion of all updates echo "[Info] Updating proxmox containers completed at $(date)" echo "[Info] Updating proxmox containers completed at $(date)" >> $container_main_log_file echo "--------------------------------------------------------------------------------------------" >> $container_main_log_file
Как контролировать временные процессоры и скорости FAN в виртуальной среде Proxmox
Если вы ищете способ следить за своим выделенный сервер датчики внутри Proxmox (PVE) следуют этим простым шагам. Это bash Сценарий устанавливает модификацию веб-интерфейса пользователя Proxmox Virtual Environment (PVE) (UI) для отображения показаний датчиков гибким и читаемым способом, который может быть полезен для мониторинга вашего здоровья Proxmox Servers. Поддерживаются CPU, NVMe/HDD/SSD температуры (Celsius/Fahrenheit), скорость вентилятора и температура тарана. Модификация включает в себя три основных этапа: Создать резервные копии исходных файлов, расположенных на /usr/share/pve-manager/js/pvemanagerlib.jsи /usr/share/perl5/PVE/API2/Nodes.pmв backupКаталог относительно места действия сценария. Добавить новый код в Nodes.pmфайл, который позволяет считывать датчик системы хоста с помощью sensorsКомандованием. Изменить pvemanagerlib.jsфайл для расширения пространства в представлении состояния узла, добавьте новые элементы, которые отображают информацию о температуре в Celsius для процессоров, дисков NVMe, жестких дисков / SSD и скорости вентилятора (фактический список элементов зависит от показаний датчика, доступных во время установки). Макет просмотра также корректируется, чтобы больше не соответствовать настройке номера столбцов и всегда расширяется до полной ширины окна браузера. Также можно разрушить панель вертикально. Наконец, сценарий также перезапускает pveproxyСервис для применения изменений. Установить Инструкции выполняются как «корневой», так как обычные пользователи не имеют доступа к файлам. apt-get install lm-sensors # lm-sensors need configure, run below to configure your sensors, or refer to lm-sensors manual. sensors-detect wget https://raw.githubusercontent.com/Meliox/PVE-mods/main/pve-mod-gui-sensors.sh bash pve-mod-gui-sensors.sh install # Then clear the browser cache to ensure all changes are visualized. Сам сценарий текст файла pve-mod-gui-sensors.sh: #!/usr/bin/env bash # # This bash script installs a modification to the Proxmox Virtual Environment (PVE) web user interface (UI) to display sensors information. # ################### Configuration ############# # Display configuration for HDD, NVME, CPU # Set to 0 to disable line breaks # Note: use these settings only if the displayed layout is broken CPU_ITEMS_PER_ROW=0 NVME_ITEMS_PER_ROW=0 HDD_ITEMS_PER_ROW=0 # Known CPU sensor names. They can be full or partial but should ensure unambiguous identification. # Should new ones be added, also update logic in configure() function. KNOWN_CPU_SENSORS=("coretemp-isa-" "k10temp-pci-") # This script's working directory SCRIPT_CWD="$(dirname "$(readlink -f "$0")")" # Files backup location BACKUP_DIR="$SCRIPT_CWD/backup" # File paths PVE_MANAGER_LIB_JS_FILE="/usr/share/pve-manager/js/pvemanagerlib.js" NODES_PM_FILE="/usr/share/perl5/PVE/API2/Nodes.pm" # Debug location DEBUG_SAVE_PATH="$SCRIPT_CWD" DEBUG_SAVE_FILENAME="sensorsdata.json" ##################### DO NOT EDIT BELOW ####################### # Only to be used to debug on other systems. Save the "sensor -j" output into a json file. # Information will be loaded for script configuration and presented in Proxmox. DEBUG_REMOTE=false DEBUG_JSON_FILE="/tmp/sensordata.json" # Helper functions function msg { echo -e "\e[0m$1\e[0m" } #echo message in bold function msgb { echo -e "\e[1m$1\e[0m" } function info { echo -e "\e[0;32m[info] $1\e[0m" } function warn { echo -e "\e[0;93m[warning] $1\e[0m" } function err { echo -e "\e[0;31m[error] $1\e[0m" exit 1 } function ask { read -p $'\n\e[0;32m'"$1:"$'\e[0m'" " response echo $response } # End of helper functions # Function to display usage information function usage { msgb "\nUsage:\n$0 [install | uninstall | save-sensors-data]\n" exit 1 } # Define a function to install packages function install_packages { # Check if the 'sensors' command is available on the system if (! command -v sensors &>/dev/null); then # If the 'sensors' command is not available, prompt the user to install lm-sensors local choiceInstallLmSensors=$(ask "lm-sensors is not installed. Would you like to install it? (y/n)") case "$choiceInstallLmSensors" in [yY]) # If the user chooses to install lm-sensors, update the package list and install the package apt-get update apt-get install lm-sensors ;; [nN]) # If the user chooses not to install lm-sensors, exit the script with a zero status code msg "Decided to not install lm-sensors. The mod cannot run without it. Exiting..." exit 0 ;; *) # If the user enters an invalid input, print an error message and exit the script with a non-zero status code err "Invalid input. Exiting..." ;; esac fi } function configure { SENSORS_DETECTED=false local sensorsOutput if [ $DEBUG_REMOTE = true ]; then warn "Remote debugging is used. Sensor readings from dump file $DEBUG_JSON_FILE will be used." sensorsOutput=$(cat $DEBUG_JSON_FILE) else sensorsOutput=$(sensors -j) fi if [ $? -ne 0 ]; then err "Sensor output error.\n\nCommand output:\n${sensorsOutput}\n\nExiting...\n" fi # Check if CPU is part of known list for autoconfiguration msg "\nDetecting support for CPU temperature sensors..." supportedCPU=false for item in "${KNOWN_CPU_SENSORS[@]}"; do if (echo "$sensorsOutput" | grep -q "$item"); then echo $item supportedCPU=true fi done # Prompt user for which CPU temperature to use if [ $supportedCPU = true ]; then while true; do local choiceTempDisplayType=$(ask "Do you wish to display temperatures for all cores [C] or just an average temperature per CPU [a] (note: AMD only supports average)? (C/a)") case "$choiceTempDisplayType" in # Set temperature search criteria [cC] | "") CPU_TEMP_TARGET="Core" info "Temperatures will be displayed for all cores." ;; [aA]) CPU_TEMP_TARGET="Package" info "An average temperature will be displayed per CPU." ;; *) # If the user enters an invalid input, print an warning message and retry as> warn "Invalid input." continue ;; esac break done SENSORS_DETECTED=true else warn "No CPU temperature sensors found." fi # Look for ram temps msg "\nDetecting support for RAM temperature sensors..." if (echo "$sensorsOutput" | grep -q '"SODIMM":'); then msg "Detected RAM temperature sensors:\n$(echo "$sensorsOutput" | grep -o '"SODIMM[^"]*"' | sed 's/"//g')" ENABLE_RAM_TEMP=true SENSORS_DETECTED=true else warn "No RAM temperature sensors found." ENABLE_RAM_TEMP=false fi # Check if HDD/SSD data is installed msg "\nDetecting support for HDD/SDD temperature sensors..." if (lsmod | grep -wq "drivetemp"); then # Check if SDD/HDD data is available if (echo "$sensorsOutput" | grep -q "drivetemp-scsi-"); then msg "Detected sensors:\n$(echo "$sensorsOutput" | grep -o '"drivetemp-scsi[^"]*"' | sed 's/"//g')" ENABLE_HDD_TEMP=true SENSORS_DETECTED=true else warn "Kernel module \"drivetemp\" is not installed. HDD/SDD temperatures will not be available." ENABLE_HDD_TEMP=false fi else warn "No HDD/SSD temperature sensors found." ENABLE_HDD_TEMP=false fi # Check if NVMe data is available msg "\nDetecting support for NVMe temperature sensors..." if (echo "$sensorsOutput" | grep -q "nvme-"); then msg "Detected sensors:\n$(echo "$sensorsOutput" | grep -o '"nvme[^"]*"' | sed 's/"//g')" ENABLE_NVME_TEMP=true SENSORS_DETECTED=true else warn "No NVMe temperature sensors found." ENABLE_NVME_TEMP=false fi # Look for fan speeds msg "\nDetecting support for fan speed readings..." if (echo "$sensorsOutput" | grep -q "fan[0-9]*_input"); then msg "Detected fan speed sensors:\n$(echo $sensorsOutput | grep -Po '"[^"]*":\s*\{\s*"fan[0-9]*_input[^}]*' | sed -E 's/"([^"]*)":.*/\1/')" ENABLE_FAN_SPEED=true SENSORS_DETECTED=true # Prompt user for display zero speed fans local choiceDisplayZeroSpeedFans=$(ask "Do you wish to display fans reporting a speed of zero? If no, only active fans will be displayed. (Y/n)") case "$choiceDisplayZeroSpeedFans" in # Set temperature search criteria [yY]|"") DISPLAY_ZERO_SPEED_FANS=true ;; [nN] ) DISPLAY_ZERO_SPEED_FANS=false ;; *) # If the user enters an invalid input, print an error message and exit the script with a non-zero status code err "Invalid input. Exiting..." ;; esac else warn "No fan speed sensors found." ENABLE_FAN_SPEED=false fi if [ $SENSORS_DETECTED = true ]; then local choiceTempUnit=$(ask "Do you wish to display temperatures in degrees Celsius [C] or Fahrenheit [f]? (C/f)") case "$choiceTempUnit" in [cC] | "") TEMP_UNIT="C" info "Temperatures will be presented in degrees Celsius." ;; [fF]) TEMP_UNIT="F" info "Temperatures will be presented in degrees Fahrenheit." ;; *) warn "Invalid unit selected. Temperatures will be displayed in degrees Celsius." TEMP_UNIT="C" ;; esac fi # DMI Type: # 1 ... System Information # 2 ... Base Board Information (for self-made PC) for i in 1 2; do echo "type ${i})" dmidecode -t ${i} | awk -F': ' '/Manufacturer|Product Name|Serial Number/ {print $1": "$2}' done local choiceEnableSystemInfo=$(ask "Do you wish to enable system information? (1/2/n)") case "$choiceEnableSystemInfo" in [1] | "") ENABLE_SYSTEM_INFO=true SYSTEM_INFO_TYPE=1 info "System information will be displayed..." ;; [2]) ENABLE_SYSTEM_INFO=true SYSTEM_INFO_TYPE=2 info "Motherboard information will be displayed..." ;; [nN]) ENABLE_SYSTEM_INFO=false info "System information will NOT be displayed..." ;; *) warn "Invalid selection. System information will be displayed." ENABLE_SYSTEM_INFO=true ;; esac echo # add a new line } # Function to install the modification function install_mod { if [[ -n $(cat $NODES_PM_FILE | grep -e "$res->{sensorsOutput}") ]] && [[ -n $(cat $NODES_PM_FILE | grep -e "$res->{systemInfo}") ]]; then err "Mod is already installed. Uninstall existing before installing." exit fi msg "\nPreparing mod installation..." # Provide sensor configuration configure # Create backup of original files mkdir -p "$BACKUP_DIR" local timestamp=$(date '+%Y-%m-%d_%H-%M-%S') # Perform backup # Create backup of original file cp "$NODES_PM_FILE" "$BACKUP_DIR/Nodes.pm.$timestamp" # Verify backup file was created and is identical if [ -f "$BACKUP_DIR/Nodes.pm.$timestamp" ]; then if cmp -s "$NODES_PM_FILE" "$BACKUP_DIR/Nodes.pm.$timestamp"; then msg "Backup of \"$NODES_PM_FILE\" saved to \"$BACKUP_DIR/Nodes.pm.$timestamp\" and verified." else msg "WARNING: Backup file \"$BACKUP_DIR/Nodes.pm.$timestamp\" differs from original. Exiting..." exit 1 fi else msg "ERROR: Failed to create backup \"$BACKUP_DIR/Nodes.pm.$timestamp\". Exiting..." exit 1 fi # Create backup of original file cp "$PVE_MANAGER_LIB_JS_FILE" "$BACKUP_DIR/pvemanagerlib.js.$timestamp" # Verify backup file was created and is identical if [ -f "$BACKUP_DIR/pvemanagerlib.js.$timestamp" ]; then if cmp -s "$PVE_MANAGER_LIB_JS_FILE" "$BACKUP_DIR/pvemanagerlib.js.$timestamp"; then msg "Backup of \"$PVE_MANAGER_LIB_JS_FILE\" saved to \"$BACKUP_DIR/pvemanagerlib.js.$timestamp\" and verified." else msg "WARNING: Backup file \"$BACKUP_DIR/pvemanagerlib.js.$timestamp\" differs from original. Exiting..." exit 1 fi else msg "ERROR: Failed to create backup \"$BACKUP_DIR/pvemanagerlib.js.$timestamp\". Exiting..." exit 1 fi if [ $SENSORS_DETECTED = true ]; then local sensorsCmd if [ $DEBUG_REMOTE = true ]; then sensorsCmd="cat \"$DEBUG_JSON_FILE\"" else # WTF: sensors -f used for Fahrenheit breaks the fan speeds 😐 #local sensorsCmd=$([[ "$TEMP_UNIT" = "F" ]] && echo "sensors -j -f" || echo "sensors -j") sensorsCmd="sensors -j" fi sed -i '/my \$dinfo = df('\''\/'\'', 1);/i\'$'\t''$res->{sensorsOutput} = `'"$sensorsCmd"'`;\n\t# sanitize JSON output\n\t$res->{sensorsOutput} =~ s/ERROR:.+\\s(\\w+):\\s(.+)/\\"$1\\": 0.000,/g;\n\t$res->{sensorsOutput} =~ s/ERROR:.+\\s(\\w+)!/\\"$1\\": 0.000,/g;\n\t$res->{sensorsOutput} =~ s/,(.*[.\\n]*.+})/$1/g;\n' "$NODES_PM_FILE" msg "Sensors' output added to \"$NODES_PM_FILE\"." fi if [ $ENABLE_SYSTEM_INFO = true ]; then local systemInfoCmd=$(dmidecode -t ${SYSTEM_INFO_TYPE} | awk -F': ' '/Manufacturer|Product Name|Serial Number/ {print $1": "$2}' | awk '{$1=$1};1' | sed 's/$/ |/' | paste -sd " " - | sed 's/ |$//') sed -i "/my \$dinfo = df('\/', 1);/i\\\t\$res->{systemInfo} = \"$(echo "$systemInfoCmd")\";\n" "$NODES_PM_FILE" msg "System information output added to \"$NODES_PM_FILE\"." fi # Add new item to the items array in PVE.node.StatusView if [[ -z $(cat "$PVE_MANAGER_LIB_JS_FILE" | grep -e "itemId: 'thermal[[:alnum:]]*'") ]]; then local tempHelperCtorParams=$([[ "$TEMP_UNIT" = "F" ]] && echo '{srcUnit: PVE.mod.TempHelper.CELSIUS, dstUnit: PVE.mod.TempHelper.FAHRENHEIT}' || echo '{srcUnit: PVE.mod.TempHelper.CELSIUS, dstUnit: PVE.mod.TempHelper.CELSIUS}') # Expand space in StatusView sed -i "/Ext.define('PVE\.node\.StatusView'/,/\},/ { s/\(bodyPadding:\) '[^']*'/\1 '20 15 20 15'/ s/height: [0-9]\+/minHeight: 360,\n\tflex: 1,\n\tcollapsible: true,\n\ttitleCollapse: true/ s/\(tableAttrs:.*$\)/trAttrs: \{ valign: 'top' \},\n\t\1/ }" "$PVE_MANAGER_LIB_JS_FILE" msg "Expanded space in \"$PVE_MANAGER_LIB_JS_FILE\"." sed -i "/^Ext.define('PVE.node.StatusView'/i\ Ext.define('PVE.mod.TempHelper', {\n\ //singleton: true,\n\ \n\ requires: ['Ext.util.Format'],\n\ \n\ statics: {\n\ CELSIUS: 0,\n\ FAHRENHEIT: 1\n\ },\n\ \n\ srcUnit: null,\n\ dstUnit: null,\n\ \n\ isValidUnit: function (unit) {\n\ return (\n\ Ext.isNumber(unit) && (unit === this.self.CELSIUS || unit === this.self.FAHRENHEIT)\n\ );\n\ },\n\ \n\ constructor: function (config) {\n\ this.srcUnit = config && this.isValidUnit(config.srcUnit) ? config.srcUnit : this.self.CELSIUS;\n\ this.dstUnit = config && this.isValidUnit(config.dstUnit) ? config.dstUnit : this.self.CELSIUS;\n\ },\n\ \n\ toFahrenheit: function (tempCelsius) {\n\ return Ext.isNumber(tempCelsius)\n\ ? tempCelsius * 9 / 5 + 32\n\ : NaN;\n\ },\n\ \n\ toCelsius: function (tempFahrenheit) {\n\ return Ext.isNumber(tempFahrenheit)\n\ ? (tempFahrenheit - 32) * 5 / 9\n\ : NaN;\n\ },\n\ \n\ getTemp: function (value) {\n\ if (this.srcUnit !== this.dstUnit) {\n\ switch (this.srcUnit) {\n\ case this.self.CELSIUS:\n\ switch (this.dstUnit) {\n\ case this.self.FAHRENHEIT:\n\ return this.toFahrenheit(value);\n\ \n\ default:\n\ Ext.raise({\n\ msg:\n\ 'Unsupported destination temperature unit: ' + this.dstUnit,\n\ });\n\ }\n\ case this.self.FAHRENHEIT:\n\ switch (this.dstUnit) {\n\ case this.self.CELSIUS:\n\ return this.toCelsius(value);\n\ \n\ default:\n\ Ext.raise({\n\ msg:\n\ 'Unsupported destination temperature unit: ' + this.dstUnit,\n\ });\n\ }\n\ default:\n\ Ext.raise({\n\ msg: 'Unsupported source temperature unit: ' + this.srcUnit,\n\ });\n\ }\n\ } else {\n\ return value;\n\ }\n\ },\n\ \n\ getUnit: function(plainText) {\n\ switch (this.dstUnit) {\n\ case this.self.CELSIUS:\n\ return plainText !== true ? '\°C' : '\\\'C';\n\ \n\ case this.self.FAHRENHEIT:\n\\n\ return plainText !== true ? '\°F' : '\\\'F';\n\ \n\ default:\n\ Ext.raise({\n\ msg: 'Unsupported destination temperature unit: ' + this.srcUnit,\n\ });\n\ }\n\ },\n\ });\n" "$PVE_MANAGER_LIB_JS_FILE" if [ $ENABLE_SYSTEM_INFO = true ]; then sed -i "/^Ext.define('PVE.node.StatusView',/ { :a; /items:/!{N;ba;} :b; /cpus.*},/!{N;bb;} a\ \\ {\n\ itemId: 'sysinfo',\n\ colspan: 2,\n\ printBar: false,\n\ title: gettext('System Information'),\n\ textField: 'systemInfo',\n\ renderer: function(value){\n\ return value;\n\ }\n\ }, }" "$PVE_MANAGER_LIB_JS_FILE" fi sed -i "/^Ext.define('PVE.node.StatusView',/ { :a; /items:/!{N;ba;} :b; /cpus.*},/!{N;bb;} a\ \\ {\n\ itemId: 'thermalCpu',\n\ colspan: 2,\n\ printBar: false,\n\ title: gettext('CPU Thermal State'),\n\ iconCls: 'fa fa-fw fa-thermometer-half',\n\ textField: 'sensorsOutput',\n\ renderer: function(value){\n\ // sensors configuration\n\ const cpuTempHelper = Ext.create('PVE.mod.TempHelper', $tempHelperCtorParams);\n\ // display configuration\n\ const itemsPerRow = $CPU_ITEMS_PER_ROW;\n\ // ---\n\ let objValue;\n\ try {\n\ objValue = JSON.parse(value) || {};\n\ } catch(e) {\n\ objValue = {};\n\ }\n\ const cpuKeysI = Object.keys(objValue).filter(item => String(item).startsWith('coretemp-isa-')).sort();\n\ const cpuKeysA = Object.keys(objValue).filter(item => String(item).startsWith('k10temp-pci-')).sort();\n\ const bINTEL = cpuKeysI.length > 0 ? true : false;\n\ const INTELPackagePrefix = '$CPU_TEMP_TARGET' == 'Core' ? 'Core ' : 'Package id';\n\ const INTELPackageCaption =...
CPU temp + ID отсутствует Dashboard Webmin
Вы можете попробовать следующую команду для применения патча: cd /usr/share/webmin && curl https://github.com/webmin/webmin/commit/a85fa2f8c281fd28e1a4a80c44d08231681be077.patch | git apply --reject --whitespace=fix … затем не забудьте перезапустить Webmin вручную с помощью systemctl restart webminкоманда и, наконец, принудительное обновление системной информации с помощью верхней правой кнопки обновления в приборной панели. Показывает ли он информацию о температуре процессора сейчас? Сам текст патча (a85fa2f8c281fd28e1a4a80c44d08231681be077.patch) скопировать и вставить в файл можно: From a85fa2f8c281fd28e1a4a80c44d08231681be077 Mon Sep 17 00:00:00 2001 From: Ilia Ross <ilia@ross.gdn> Date: Thu, 19 Oct 2023 20:35:57 +0300 Subject: [PATCH] Fix Cortex CPU detection in `sensors` output https://forum.virtualmin.com/t/cpu-temp-id-missing-dashboard/123096 [build] --- proc/linux-lib.pl | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/proc/linux-lib.pl b/proc/linux-lib.pl index 0061f03e68..ff0caea441 100755 --- a/proc/linux-lib.pl +++ b/proc/linux-lib.pl @@ -500,7 +500,7 @@ sub get_current_cpu_data my @fans; my @cputhermisters; if (&has_command("sensors")) { - my ($cpu, $cpu_aux, $cpu_package, $cpu_broadcom, $cpu_amd); + my ($cpu, $cpu_aux, $cpu_unnamed, $cpu_package, $cpu_broadcom, $cpu_amd); my $fh = "SENSORS"; # Examples https://gist.github.com/547451c9ca376b2d18f9bb8d3748276c @@ -563,7 +563,7 @@ sub get_current_cpu_data else { # Auxiliary CPU temperature and fans were already captured - next if ($cpu_aux); + next if ($cpu_aux && !$cpu_unnamed); # CPU types ($cpu_broadcom) = $_ =~ /cpu_thermal-virtual-[\d]+/i if (!$cpu_broadcom); @@ -598,6 +598,13 @@ sub get_current_cpu_data 'temp' => int($2) }); } + elsif (/cpu\s+temp(.*?):\s+([\+\-][0-9\.]+)/i) { + $cpu_unnamed++; + push(@cpu, + { 'core' => $cpu_unnamed, + 'temp' => int($2) + }); + } } # AMD
Жесткие диски можно пробрасывать как через проброс физического контроллера жестких дисков
Жесткие диски можно пробрасывать как через проброс физического контроллера жестких дисков, как PCIe устройство, (не рекомендую пробрасывать контроллер интегрированный в материнскую плату, только подключенные к PCIe), либо напрямую: заходим в ## cd /dev/disk/by-id через dir смотрим листинг… копируем строки вида ata-WDC_WD40EFRX-68WT0N6_WD-WCC4E1АС9SХ9, в которой прописан интерфейс подключения, марка и номер серии жесткого диска. 1 вариант: Затем открываем Файл конфигурации ВМ и пишем: sata1: volume=/dev/disk/by-id/ata-WDC_WD40EFRX-68WT0N6_WD-WCC4E1АС9SХ9 и все работает, при этом учитывайте, что sata0-sata5, т.е. для одной ВМ число подключаемых таким образом дисков, включая виртуальных, не может превышать 6шт. 2 вариант: в консоле пишем команду: qm set 101 -scsi1 /dev/disk/by-id/ata-ST3000DM001-1CH166_Z1F41BLC Если же бэкап будет осуществлять не виртуалкой, а хостом с ProxMox’ом, то нужно ставить PROXMOX BACKUP SERVER при этом если это будет SSD диск, то нужно будет озаботится что бы trim был настроен и работал для него
Часть 2: выбираем сервисы
Установка приложений, настройка сервисов Спланировав хранилище, перехожу к установке программного обеспечения. Docker уже установлен, и теперь я установлю поддержку файловой системы MergerFS и SnapRAID для архивного массива данных. Для примера возьмём 8 HDD, на которых будут располагаться файлы. С помощью WebUI Proxmox я форматирую их в EXT4, но не добавляю в качестве хранилища для гипервизора. На этом этапе я выбираю точку монтирования в отдельном каталоге /mnt/pve, и для 7 жёстких дисков задаю созвучные имена media-disk-1 media-disk-2 … media-disk-7, а 8-й жёсткий диск отдам под хранение чётности для SnapRAID и смонтирую его с именем disk-parity-1 в ту же директорию. Хочу обратить внимание, что Proxmox VE не записывает точки монтирования в /etc/fstab, поэтому если вытащить один из этих дисков на выключенном сервере, машина всё равно загрузится и продолжит работать, архивный том будет доступен, а информация на оставшихся дисках сохранится. Пакет MergerFS я устанавливаю не из репозитория, а со страницы разработчика на Github, поскольку эта версия лучше работает под Debian. Да, в отличии от Synology, где всё сделали за нас, здесь приходится заморачиваться с версиями пакетов. Файловая система MergerFS имеет несколько алгоритмов распределения записываемых файлов по директориям дисков. Например, она может распределять файлы случайным порядком по дискам, а может сначала заполнять один носитель, а потом переходить к следующему. Сами файлы на части она не разбивает, поэтому если массив собран из 1 Тб жёстких дисков, будь их хоть 10, вы не сможете записать туда файл объёмом 1.5 Тб. Все параметры, с которыми MergerFS объединяет физические диски в логический том, задаются на этапе монтирования в /etc/fstab, поэтому из командной строки выполняю следующую команду: nano /etc/fstab в открытый файл добавляю строку /mnt/pve/media-disk* /storage/media-merger fuse.mergerfs defaults,nonempty,allow_other,use_ino,cache.files=partial,moveonenospc=true,cache.statfs=60,cache.readdir=true,category.create=msplfs,dropcacheonclose=true,minfreespace=5G,fsname=mergerfs 0 0 как вы видите, в самом начале параметр /mnt/pve/media-disk* указывает, что в общую файловую систему монтируются все доступные диски с именами, начинающимися с media-disk. И не важно сколько их будет при загрузке: 5, 6 или 10: при вылете любого из них, система загрузится и общий том смонтируется в папку /storage/media-merger. Обратите внимание - диск disk-parity-1 сюда не входит. Выполняем команду mount -a и проверяем, что в папке /storage/media-merger свободное место равняется сумме всех включённых в массив дисков. Рекомендации по настройке связки MergerFS + Snapraid и подробное описание, как всё работает, вы найдёте здесь. Контейнеры: LXC и Docker, в чём на самом деле разница? Proxmox, в отличии от Synology DSM, поддерживает контейнерную виртуализацию LXC, но не имеет нативной поддержки Docker. Второй вопрос мы уже решили двумя абзацами сверху, а теперь позвольте пару слов об LXC, если вы ещё не сталкивались с этим типом виртуализации. В интернете есть много статей на тему LXC, из которых вообще не понятно, для чего они нужны, если есть Docker. Конкретно для нашего случая всё совершенно просто. Docker предлагает вам контейнер как готовое приложение, с готовым набором предустановок и пакетов. Далеко не все полезные программы упакованы в Docker, и вообще могут в нём полноценно работать, а некоторым вообще Docker виртуализация противопоказана, а инструкции для установки есть только для веток Debian и Red Hat. Любые изменения внутри образа контейнера теряются после его перезагрузки, поэтому изменить установочные пакеты не то чтобы нельзя, а муторно. Куда проще запустить LXC контейнер, и через 10 секунд получить аналог виртуалки, зайти по SSH и установить нужный тебе софт вручную. Контейнер имеет собственный IP-адрес, поэтому вы не заморачиваетесь с доступностью внешних портов и настройкой обратного прокси. LXC контейнеры можно снэпшотить и бэкапить, сохраняя состояние и быстро откатываясь к предыдущим версиям, и в общем-то, какие-то программы можно быстренько тестировать в LXC, чтобы потом либо удалить, либо переупаковать в Docker, либо оставить в LXC как они есть. А общие папки файловых систем хоста можно пробрасывать в LXC контейнер так же, как в Docker (теряя при этом функцию снапшотов). Вот например, если нужно установить Samba, NFS и iSCSI серверы, то из всех возможных способов, для меня самым простым оказался LXC контейнер с Debian + Webmin. В настройках контейнера в Proxmox даже есть опции Samba и NFS, которые нужно отметить при создании контейнера. При настройке я перепробовал пару сотен программ, чтобы заменить встроенные сервисы Synology DSM, и я не стану описывать процесс установки, а лишь тезисно опишу что выбрал и почему. Почему не OwnCloud/NextCloud? Вообще, пожалуй, Nextcloud способен в большей мере заменить сервисы Synology по принципу «всё-в-одном», и если ваша направленность - настройка пространства для совместной работы с документами, то начать стоит с него. Вы получите весьма нагромождённый софт, но с единой авторизацией пользователей, хорошей поддержкой и приятным интерфейсом. Но, как и любой другой «швейцарский нож», NextCloud изобилует недоделками и отсутствием функций, которые должны быть по умолчанию. Ну вот, например, NextCloud хранит заметки пользователей в чистом .txt файле, без какой-либо защиты, а родного мобильного клиента для них нет и вовсе. И такое на каждом шагу, поэтому я придерживаюсь мнения, что лучше не скатываться к решению «всё-в-одном», а гранулярно подбирать сервисы под задачу. Что и почему я выбираю на замену сервисам Synology? Samba/NFS/iSCSI: не мудрствуя лукаво, проще всего установить CentOS LXC контейнере и настроить файловые сервисы через эту платформу, пробрасывая в контейнер тома дисковых устройств и настраивая в виртуалке права доступа для пользователей. Для управления через WebUI можно использовать Webmin. Файловый браузер: для меня является определяющим, потому что мне нужен прямой доступ к содержимому общих папок. Внимания достойны Filebrowser из-за своей простоты и Filerun из-за своей навороченности (он поддерживает даже интеграцию c Elasticsearch для поиска по файлам). Второй имеет сложности с лицензированием и неотключаемую корзину при удалении файлов и папок, из-за чего процесс удаления ненужного хлама проходит в два этапа: удаляем сам файл, а затем чистим корзину. Это может вызвать проблемы переполнения тома, поэтому от Filerun я отказался. Filebrowser устанавливается через Docker, а общие папки в него лучше пробрасывать через символические ссылки symlinks. В этом случае если папка недоступна при загрузке сервера (например, она зашифрована паролем), то после разблокировки вам не нужно будет перезапускать контейнер с Filebrowser. Стриминг медиатеки на ТВ: здесь проблема, так как основные ветки медиа-серверов представляют собой каталоги по жанрам, рейтингу и т.д. Если просто нужно вывести содержимое папок с фильмами на ТВ, то выбирать приходится между глючным Gerbera и прожорливым Serviio. Второй имеет платную и бесплатную версии, причём фриварная вполне себе способна заменить Synology Media Server. Для каталогизации медиатеки лучше использовать Emby. И Serviio и Emby можно запустить через Docker одновременно и получить два представления одной и той же домашней медиатеки: попроще и посложнее. Plex я не воспринимаю, как ни пытался его начать использовать - не понравился. Бэкапы самого сервера в облако или на сторонний сервер. Вы удивитесь, но такая простая вещь, как бэкапы, это боль в современном мире свободного ПО. Ближе всего к Synology Hyper Backup подходит программа Duplicati, находящаяся в вечной бета-стадии. Написанная под MacOS, - она запускается через эмулятор, из-за чего дико жрёт ресурсы CPU, и чтобы этого избежать, надо ставить Canary-версии, которые подаются даже не как альфа, а ещё сырее. В активах программы огромный список поддерживаемых back-end-ов, более-менее нормальный Web-интерфейс и поддержка всех возможных протоколов, в том числе FTP для бэкапа на роутеры с внешними HDD, и S3 для распределённых файловых хранилищ типа Storj. Как и Hyper Backup, она не может делать два бэкапа одновременно. Бэкапы компьютеров в сети на NAS. Здесь ещё большая проблема, чем в предыдущем случае. Какого-то аналога Active Backup for Business нет и в помине, и более-менее закрыть тему резервирования Windows-машин в том числе через интернет помогает UrBackup, мало известная, но активно разрабатываемая софтина. Эта программа сама не умеет делать дедупликацию и компрессию, но при наличии ZFS на сервере это не проблема: мы можем выбрать и самый современный тип компрессии ZSTD и включить дедупликацию на томе, который пробросим в Docker-контейнер с URBackup. Этот том нужно шифровать средствами ZFS, поскольку UrBackup хранит данные в открытом виде. Программа поддерживает резервирование томов, файлов и папок, имеет браузер данных и Rescue-диск для восстановления клиентов. Бэкапы виртуальных машин хоста: здесь очень всё хорошо, у Proxmox есть собственный продукт Backup Server с дедупликацией и инкрементальными копиями ВМ и контейнеров. Восстановлению подлежат как целиком виртуалки, так и какие-то файлы из них через Web-интерфейс. Устанавливается непосредственно на хост или в виртуалку. Бэкапы виртуалок VMware, Hyper-V и QEMU Linux: здесь всё очень плохо: за бэкапы VMware все хотят денег, и только Vincin Backup в бесплатной версии максимально приближается к Active Backup for Business, но лишь для трёх виртуалок. Да плюс ещё бесплатная версия требует лицензионный ключ, который имеет особенность слетать. Но в целом, этот софт выглядит очень многообещающе, он не такой нагруженный функционалом, как Bacula и не такой примитивный, как Borg. Его проблема в том, что он не поддерживает резервирование с Proxmox и восстановление в него. То есть, перенести виртуалки из ESXi в Proxmox через бэкап на данный момент через него нельзя. Устанавливается в отдельную виртуалку. Общее рабочее пространство: здесь всё очень хорошо: у Synology эта ветка не развита, а Pydio способна полностью закрыть вопрос общей работы с файлами и шаринга данных между рабочими группами. Устанавливается через Docker. Сервис заметок: здесь для меня было шоком, что такое развитое направление не породило никакого ultimate-решения, которым можно было бы заменить Synology Notes. Более-менее близко подходит Standard Notes, но в бесплатной версии функционал такой, что не даёт даже загружать фотки, а установка очень сложна, и требует работы через обратный прокси с SSL, то есть через домен, доступный из интернета. Остальные сервисы, либо не заточены на безопасность и шифрование, либо не устанавливаются на локальный сервер… Очень неплохо выглядит Joplin, но он не имеет Web-интерфейса, а локальный клиент хранит пароли шифрования в открытом виде в SQLite базе. Для Web-доступа шикарно выглядит Trilium, но он одно-пользовательский и без мобильного клиента. В итоге я остановился на Bitwarden в версии Vaultwarden, оптимизированной для Docker-установки, который использовал для защищённых заметок и паролей. Простые же заметки, не содержащие важных данных, отдал на откуп Joplin. VPN и Firewall - здесь всё прекрасно: я уже несколько лет работаю с PFSense, и эта операционная система в виртуалке работает на Proxmox без проблем. Если в сервере один ETH порт, то трафик можно разделять через VLAN. Установка PFSense позволит отказаться от встроенного Firewall в Proxmox, который кстати доступен индивидуально для каждой виртуалки или контейнера, а можно использовать и то и другое. Доступ через облако (аналог Quickconnect). Я считаю, что если сегодня можно купить 1-ядерную виртуалку в облаке с выделенным IP адресом менее чем за 1$ в месяц, чтобы поставить туда PFsense, подключаясь к нему через VPN или проксируя трафик через NGINX, то при таких ценах искать и настраивать аналог Quickconnect с глюками, присущими бесплатному Linux-ПО я даже не стану. Мониторинг S.M.A.R.T., температур и вентиляторов и различных метрик. Здесь всё прекрасно: во-первых, у Proxmox есть встроенный экспортер в InfluxDB и Graphite, во-вторых сбор метрик и логов очень хорошо развит на стеке Prometheus + Grafana + Loki + Promtail, и без проблем можно получить и впечатляющие графики, и быстрый поиск по логам и оповещения по алертам. Сюда же можно интегрировать InfluxDB + Telegraf, быстрый SyslogNG, сборщик SNMP метрик и IPMI. Всё нативно доступно через Docker с тоннами документации по настройке и установке, и на выходе можно получить исчерпывающий анализ работоспособности системы с гранулярностью до каждого контейнера, каждого тома на диске, каждого параметра S.M.A.R.T и анализировать как во встроенных, так и в сторонних программах. У Synology ничего подобного нет, и сравнивать не с чем. Видеонаблюдение - провал. Я не смог найти достойной замены для Surveillance Station среди свободно распространяемого ПО. Торрентокачалка - ну куда же без любимых торрентов. Здесь я выбрал qBitTorrent с Vue интерфейсом - выглядит он очень современно, доступен в Docker, активно разрабатывается и поддерживается сообществом. Имеет очень удобную функцию тегов и категорий, благодаря чему не нужно каждый раз бегать по каталогам в поисках, куда скачать фильм или сериал. Этот проект имеет существенную проблему: он потребляет около 2 Гб ОЗУ, и спокойно может скушать и 7 и 8 Гб памяти. Уплотнение на уровне Proxmox весьма помогает, но полностью проблему не решает. На фоне transmission, потребляющего 200-250 Мб памяти, это конечно, ужасная особенность, исправлять которую разработчики не собираются. Сейчас в интернете модны так называемые arr-стеки, сочетающие автоматические поисковики сериалов, фильмов, музыки и иного контента с торрентокачалками. Я попробовал - мне «не зашло», но ставится всё из Docker и настраивается весьма несложно. Снапшоты - здесь не всё так гладко, как хотелось бы. Для виртуальных машин функция мгновенных снимков хорошо интегрирована на уровне Proxmox, но вот во всём, что касается файловой системы, вам придётся полагаться...
Планирование хранилища
Мой вариант — Proxmox VE Я выбираю Proxmox VE, и вот почему. Во-первых, это хоть и бесплатный продукт, но с платной техподдержкой для Enterprise-уровня, и это накладывает отпечаток на весь дистрибутив. По той причине, что он выпускается не сообществом, а фирмой, он как минимум, не собран на коленках, как OMV, лишён космических амбиций как Truenas Scale, в отличии от Unraid, он рассчитан на работу 24×7 в Enterprise-среде, где активно и применяется, и при этом распространяется бесплатно с открытым исходным кодом, который проходит аудит сообщества, что отличает его от QNAP QTS и Synology DSM. Ядром Proxmox VE является Debian Linux, что даёт доступ к любому софту и любому современному железу, устанавливаемому в сервер (в отличии от VMware ESXi). В сообществе Proxmox VE часто подчёркивают, что данный дистрибутив — это не решение для NAS, но с моей точки зрения даже в базе Proxmox имеет достаточно, чтобы стать платформой для СХД, ведь это гипервизор с собственным слоем хранения, причём во главу угла здесь поставлена самая софременная файловая система ZFS, но при этом есть возможность создавать LVM тома, есть поддержка BTRFS RAID, EXT4 и XFS. Для мониторинга дисков есть SMART, для экспорта метрик — поддержка Graphite и InfluxDB, для отказоустойчивости — встроенный High Availability, распределённое хранилище — Ceph, а ещё двухфакторная аутентификация, API токены, собственный бэкап сервер и даже свой Firewall. То есть, в качестве платформы с Web-управлением, Proxmox выглядит зрело и функционально. Нет, скажем так: после 5 лет работы с VMware ESX, я не понимаю, почему я не перешёл на Proxmox VE раньше. Чего нет в базе Proxmox VE — это всего, что касается шаринга файлов, и всё придётся настраивать самостоятельно. Нет никаких плагинов и магазинов приложений, так что здесь в ход пойдут контейнеры, но в базе и с ними беда: Proxmox VE не поддерживает Docker, то есть весь мир с миллионами программ, устанавливающихся в одну команду, остаётся за бортом. Вместо Docker разработчики сделали упор на LXC, контейнерную виртуализацию, которая с моей точки зрения, что называется, «не взлетела» нигде, кроме как у low-cost VPS хостингов: плюсов перед аппаратной виртуализацией не много, а стандартом де-факто для контейнеров стали Docker в SMB/SOHO и Kubernetes в Enterprise, оставив LXС за бортом. Нормального бесплатного решения, аналогичного Proxmox с поддержкой Docker, в природе не существует, а без Docker пойди-ка настрой свой аналог Synology… Можно попытаться воссоздать программную платформу своими силами через Ubuntu с панелью управления Cockpit, но там нет такого уровня управления подсистемой сети и СХД, можно попробовать Webmin, но там нет такого управления виртуалками и контейнерами. И как бы я ни был против того, чтобы плодить сущности, но придётся устанавливать вручную Docker на Proxmox VE, и в качестве интерфейса управления — Portainer. Почему я ставлю Docker на сам хост, а не в виртуалку или LXC контейнер? Да потому, что инсталляция его в LXC не рекомендуется по причине падения производительности, а виртуалка даст лишний слой изоляции, который в моём случае будет просто мешать. Synology DSM 7.1 TrueNAS Core 13.0 TrueNAS Scale 22.12-RC1 OMV 6.0.46 Unraid 6.11 Proxmox VE 7.2 Файловая система EXT4, BTRFS ZFS ZFS EXT3, EXT4, BTRFS, F2FS, JFS, XFS, через плагины: ZFS XFS, BTRFS, ReiserFS XFS, EXT4, BTRFS, ZFS Блочный RAID Да Да Да Да Только для LVM пулов Cache и VM Да Файловый RAID Нет Нет Нет Да, через плагин Snapraid Да Нет Шифрование На уровне тома На уровне тома На уровне тома Нет На уровне диска Через CLI, на уровне тома и диска Качество плагинов Отлично Неуд. Неуд. Средн. Хорошо N/A Качество виртуализации Отлично Ужасно Хорошо N/A Средне Отлично Нативная поддержка Docker Отлично N/A Kubernetes Никак Хорошо N/A Нативная поддержка SMB/NFS/iSCSI/Rsync Отлично Отлично Отлично Хорошо Средне N/A Поддержка High Avail. Отлично Хорошо Хорошо N/A N/A Отлично Поддержка распред. файловых систем Нет Нет Нет Нет Нет Ceph Возможность кастомизации самой ОС под свои нужды Нет Нет Хорошо Хорошо Плохо Отлично Широко используется в бизнес-среде для сервисов 24×7 Да Да Да Нет Нет Да В Synology вы не могли, да и не имело особого смысла заниматься планированием хранилища: настройте несколько пулов и нарежьте их на тома — делов-то… В случае с Proxmox VE у нас настоящая свобода выбора. Планирование хранилища На аппаратном уровне я не нашёл ничего лучше, чем установить Proxmox на RAID-1 (ZFS Mirror) из SSD объёмом 128 Гб. Это могут быть NVME или SAS/SATA диски, не обязательно высокого класса: на них будет находиться сама ОС и хранилище для ISO файлов виртуальных машин и образов контейнеров. В основном здесь будут производиться операции чтения, поэтому и TLC накопители, и QLC здесь можно использовать даже без дополнительного охлаждения. Для высокопроизводительного слоя, используемого виртуалками и контейнерами, можно использовать U.2 PCI Express накопители, если в корпусе есть соответствующая корзина, или М.2 SSD, которые удобно устанавливать через платы бифуркации, позволяющие в 1 слот PCI Express 16x подключить 4 накопителя. Такие платы достаточно дёшевы, поскольку не имеют никаких чипов на борту, а RAID из NVME можно поднять через тот же ZFS, нативно для Proxmox. Здесь же можно создать зашифрованные тома с личными данными пользователей. Proxmox совершенно не против RAID-контроллеров, и если есть современный адаптер уровня Adaptec начиная с 7-й или 8-й серии или более поздний, то можно включив режим RAID Expose RAW, часть накопителей объединить в аппаратный RAID 5 с кэшированием и горячей подменой, получив огромную скорость линейной записи буквально любых объёмов на HDD, а часть экспонировать операционной системе в голом виде (так называемый RAW режим), чтобы управлять ими на программном уровне. Для форматирования логических дисков аппаратного RAID можно использовать файловую систему XFS, как наиболее быструю при работе поверх многодисковых массивов, а для контроля работы — установить на хост arcconf, megacli или другую родную утилиту для RAID-контроллера. Я не являюсь адептом ZFS и считаю, что сегодня есть место и для программно-определяемых хранилищ, и для аппаратных, тем более что современные RAID-контроллеры дают гибкость в выборе и возможности расширения дисковой конфигурации. Для слоя архивного хранения документов и медиа-файлов я выбираю решение Snapraid + MergerFS. Это достаточно распространённая связка для организации отказоустойчивости массива с файловым RAID за счёт создания выделенных накопителей чётности, подобно тому, как сделано в Unraid. Это решение подходит только для редко изменяемых данных, оно позволит работать с большим количеством дисков, как с единым томом, а на случай аварии выдерживать выпадение до 6 дисков с полным восстановлением данных, плюс к этому — восстанавливаться на меньшее число накопителей, то есть сжимать массив. Итого, выбирая Proxmox VE в качестве платформы, я получаю: поддержку аппаратных RAID контроллеров, разные файловые системы для разных задач, отказоустойчивый загрузочный том NVME массив дедупликацию, снэпшоты и сжатие одним из многих алгоритмов на уровне файловой системы ZFS возможность создавать зашифрованные тома в пределах ZFS поддержку снэпшотов и репликации аппаратную виртуализацию enterprise-класса контейнерную виртуализацию Docker + LXC с прямым доступом к storage слою и железу поддержку большого стека современного и устаревшего (!) железа полную бесплатность программной части возможность практически бесконечно увеличивать подсистему хранения современный Web-интерфейс для управления платформой Это несравнимо больше, чем я мог бы получить даже от тяжёлых серверов Synology бизнес-класса, но чего я не получаю на данном этапе — это SSD-кэширования для любых типов массивов, кроме ZFS, это поддержки облачного управления для доступа к серверу за NAT провайдера, красивого рабочего стола со сменными обоями и мобильных приложений на смартфон. Ничего, в следующей части всё исправим.
Установка решения вторым сайтом на Рег.ру (reg.ru)
1. После установки первого сайта переходим в настройки сайтов. 2. Создаем настройки согласно скриншоту с учетом ваших данных. В поле 6 (путь к корневой папке сервера) необходимо кликнуть ссылку «вставить текущий». 3. Создаем сайт s2 по аналогии с сайтом s1. В поле 6 путь будет отличаться именем папки в которой будет размещен второй сайт. Имя папки второго сайта можно посмотреть на хостинге. 4. Шаблон сайта можно выбрать первого сайта. Создание символьных ссылок для сайта site2.ru 1. Переходим в менеджер файлов и нажимаем кнопку «Создать». 2. Заполняем данные согласно скриншоту. Первая символьная ссылка будет для папки bitrix. Поле значение должно соответствовать пути взятого из поля 6 сайта s1 (показано выше по инструкции) с добавлением /bitrix 2. Заполняем данные согласно скриншоту. Первая символьная ссылка будет для папки upload. Поле значение должно соответствовать пути взятого из поля 6 сайта s1 (показано выше по инструкции) с добавлением /upload 3. Копируем файл .access.php и .htaccess из папки первого сайта site1.ru в папку второго сайта site2.ru 4. Указываем папку первого сайта и нажимаем кнопку копировать. После копирования в корневой папке второго сайта s2 у нас должно получиться две символьные ссылки на bitrix и upload и два файла .access.php и .htaccess Установка решения для второго сайта site2.ru Установка решения для второго сайта также производится по стандартной инструкции как и установка первого сайта. Исключением является лишь выбор сайта на первом шаге установки. Необходимо выбрать сайт для установки s2. 1. 2. Права доступа Если после установки второго сайта у вас в публичной части для неавторизированных пользователей появляется окно с авторизацией, то скорее всего для корневой папки не выставлены нужные права. 1. 2.