<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x413;&#x43B;&#x430;&#x432;&#x43D;&#x430;&#x44F;: Главная</title><link><![CDATA[https://blog.ya-hz.ru/index.php?/articles.html/%D0%BF%D0%BE%D1%81%D1%82%D0%B8%D0%BD%D0%B3/nix/&d=1]]></link><description>&#x413;&#x43B;&#x430;&#x432;&#x43D;&#x430;&#x44F;: Главная</description><language>en</language><item><title>VMware ESXi &#xAB;System Logs on host are stored on non-persistent storage&#xBB;</title><link>https://blog.ya-hz.ru/index.php?/articles.html/%D0%BF%D0%BE%D1%81%D1%82%D0%B8%D0%BD%D0%B3/nix/vmware-esxi-%C2%ABsystem-logs-on-host-are-stored-on-non-persistent-storage%C2%BB-r5/</link><description><![CDATA[
<p><img src="https://blog.ya-hz.ru/uploads/monthly_2021_10/png-transparent-green-and-yellow-logo-vmware-vsphere-vmware-esxi-virtual-machine-host-high-definition-miscellaneous-computer-network-text.png.00f4ead3d85f3055a34f4f2dfcb726d2.png" /></p>
<p>
	И так. Первое что следует понимать: ESXi у меня стоит на флешке. При установке туда, установшик делает разметку. По итогу большая часть флешки не используется, а для всего остального места может и не хватать. Поэтому расширить раздел на флешке, довольно муторный процесс, и для этого в любом случае придётся останавливать сервер, что не является возможным. К тому же в стандартных средствах ESXi я не смог найти как это сделать без остановки сервера.
</p>

<p style="text-align:center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="9" data-ratio="81.87" width="728" alt="1612033088_izobrazhenie_2021-01-31_015726.png.4b2227a45376d715c484c79b6ca62b9a.png" data-src="https://blog.ya-hz.ru/uploads/monthly_2021_10/1612033088_izobrazhenie_2021-01-31_015726.png.4b2227a45376d715c484c79b6ca62b9a.png" src="https://blog.ya-hz.ru/applications/core/interface/js/spacer.png" />
</p>

<p>
	Поэтому было принято решение просто перенести хранение логов в другое место. Я решил использовать внешнюю NFS шару. Как прицепить к яслям NFS шару - это отдельная статья. Но там ничего сложного нет. На прицепленной к ESXi NFS шаре создал папки для каждого ESXi сервера. 
</p>

<p style="text-align:center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="10" data-ratio="53.50" width="929" alt="1612033338_izobrazhenie_2021-01-31_020044.png.bba15eb34479acbd087c766f8e74ce09.png" data-src="https://blog.ya-hz.ru/uploads/monthly_2021_10/1612033338_izobrazhenie_2021-01-31_020044.png.bba15eb34479acbd087c766f8e74ce09.png" src="https://blog.ya-hz.ru/applications/core/interface/js/spacer.png" />
</p>

<p>
	Для смены папки для хранения логов идём в Manage - System - Advanced Settings и ищем там параметр 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">Syslog.global.logDir</span></pre>

<p>
	и меняем его значение на нужное нам. Там же можно настроить ротацию логов
</p>
]]></description><guid isPermaLink="false">5</guid><pubDate>Wed, 13 Oct 2021 15:16:18 +0000</pubDate></item><item><title>LAMP &#x43D;&#x430; Centos8 Stream</title><link>https://blog.ya-hz.ru/index.php?/articles.html/%D0%BF%D0%BE%D1%81%D1%82%D0%B8%D0%BD%D0%B3/nix/lamp-%D0%BD%D0%B0-centos8-stream-r8/</link><description><![CDATA[
<p><img src="https://blog.ya-hz.ru/uploads/monthly_2021_10/apache_default_page.png.865e5909ec5b53a978bf1f36c404b184.png" /></p>
<p>
	У меня было несколько сайтов/проектов которые крутились где попало. Например сайт крутился на OpenServer, облако в виртуалке, pma вообще небыло, пользовался HeidySQL который поставлялся вместе с OpenServer. И в один прекрасный момент мне это всё надоело, и я решил объединить всё на одном сервере. Почему именно на Centos8? Да просто мне нравится эта система. Да, я вкурсе что 31.12.2021 - прекращается её поддержка, поэтому я выбрал Centos8 Stream. 
</p>

<p>
	В этой статье я не буду касаться установки и настройки системы. Так не буду затрагивать безопасность, т.е. настройку selinux и собственно firewall. Безопасность это дело сугубо индивидуальное, и настраивать его нужно под свои возможности и потребности. Поэтому после запуска системы, сразу отключаем selinux и firewall
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">setenforce 0
systemctl stop firewalld
systemctl disable firewalld</span></pre>

<p>
	<span style="font-size:18px;"><strong>Установка и настройка Apache</strong></span>
</p>

<p>
	Начнём с установки Apache. 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">dnf install httpd</span></pre>

<p>
	добавляем его в автозагрузку
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">systemctl enable httpd</span></pre>

<p>
	и запускаем его
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">systemctl start httpd</span></pre>

<p>
	Собственно установка на этом закончена. Уже сейчас если перейти в браузере на ip адрес вашего сервера, то можно увидеть тестовую страницу Apache. Конечно если у вас отключен firewall. Так же работу можно проверить следующей командой
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">netstat -tulnp | grep httpd</span></pre>

<p>
	Вывод будет примерно следующий: 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">tcp6       0      0 :::80                   :::*                    LISTEN      1205/httpd</span></pre>

<p>
	Теперь можно приступать к непосредственной настройке Apache. У Centos есть фишка. Если не уделить внимания разметке жесткого диска, он сделает разметку примерно следующего вида: 
</p>

<p style="text-align:center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="29" data-ratio="34.27" width="464" alt="image.png.19592bcc2076806556eb59d9b0ea3a6f.png" data-src="https://blog.ya-hz.ru/uploads/monthly_2021_10/image.png.19592bcc2076806556eb59d9b0ea3a6f.png" src="https://blog.ya-hz.ru/applications/core/interface/js/spacer.png" />
</p>

<p>
	т.е. раздел /home - будет самым большим. Я несколько раз подъёбывался на этот счёт. Вы можете разметку сделать самостоятельно, т.к. вам нужно, или оставить как есть. В этой статье мы этого касаться не будем. Поэтому все файлы веб-сервера будут лежать в директории /home. Я использую примерно следующую структуру: 
</p>

<p>
	/home/sites - тут лежат все сайты
</p>

<p>
	/home/sites/site1 - папка с сайтом
</p>

<p>
	/home/sites/site1/www - собственно файлы сайта
</p>

<p>
	/home/sites/site1/log - логи сайта
</p>

<p>
	Создаём все нужные директории одной командой и назначаем владельцем директорий apache
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">mkdir -p /home/sites/site1.ru/{www,log}
chown -R apache. /home/sites/</span></pre>

<p>
	Дальше нам нужно посмотреть раскоменчена ли строчка в конце файла /etc/httpd/conf/httpd.conf
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">IncludeOptional conf.d/*.conf</span></pre>

<p>
	Эта строчка нужна для того чтобы не городить все найстройки в одном месте, а для каждого сайта будет свой отдельный конфиг. Создадим конфиг для первого сайта: 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">nano /etc/httpd/conf.d/site1.ru.conf</span></pre>

<p>
	следующего содержания
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;VirtualHost</span><span class="pln"> *:80</span><span class="tag">&gt;</span><span class="pln">

    ServerName site1.ru
    ServerAlias www.site1.ru
    DocumentRoot /home/sites/site1.ru/www

    ErrorLog /home/sites/site1.ru/log/error.log
    CustomLog /home/sites/site1.ru/log/access.log common

    </span><span class="tag">&lt;Directory</span><span class="pln"> </span><span class="pun">/</span><span class="atn">home</span><span class="pun">/</span><span class="atn">sites</span><span class="pun">/</span><span class="atn">site1</span><span class="pln">.</span><span class="atn">ru</span><span class="pun">/</span><span class="atn">www</span><span class="tag">&gt;</span><span class="pln">
        Options FollowSymLinks
        AllowOverride All
        Require all granted
    </span><span class="tag">&lt;/Directory&gt;</span><span class="pln">

</span><span class="tag">&lt;/VirtualHost&gt;</span></pre>

<p>
	Проверим конфигурацию
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">apachectl -t</span></pre>

<p>
	Apache может ругнуться
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::95:c6f3:e49f:7204. Set the 'ServerName' directive globally to suppress this message</span></pre>

<p>
	Это просто предупреждение, и его можно игнорировать. А можно отредактировать файл /etc/hostname и указать там имя своего сервера. В любом случае, если всё сделано правильно, Apache должен написать 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">Syntax OK</span></pre>

<p>
	После этого можно перезапуститься Apache
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">systemctl restart httpd</span></pre>

<p>
	или
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">apachectl restart</span></pre>

<p>
	Если Apache не стартанул, то смотрил логи
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">tail -f /var/log/httpd/error_log</span></pre>

<p>
	но в текущей конфигурации проблем быть не должно. Для полноценной проверки того что всё работает как надо, создадим файл index.html в директории нашего нового сайта /home/sites/site1.ru/www. Напомню, что по умолчанию директория для файлов сайта /var/www/html. Но мы ей пользоваться не будем. 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">nano /home/sites/site1.ru/www/index.html</span></pre>

<p>
	Содержание файла
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;center&gt;&lt;font</span><span class="pln"> </span><span class="atn">color</span><span class="pun">=</span><span class="atv">red</span><span class="pln"> </span><span class="atn">size</span><span class="pun">=</span><span class="atv">7</span><span class="tag">&gt;</span><span class="pln">Hello World</span><span class="tag">&lt;/font&gt;&lt;/center&gt;</span></pre>

<p>
	Сделаем владельцем файла apache
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">chown apache. /home/sites/site1.ru/www/index.html</span></pre>

<p>
	Теперь если перейти по адресу вашего сервера, вы увидите не тестовую страницу, а эту страничку которую мы только что создали, а именно: белый фон, и по центру большими красными буквами hello world. Это означает что сам веб сервер уже прекрасно работает, и можно двигаться дальше. 
</p>

<p>
	<span style="font-size:18px;"><strong>Установка php с последующим обновлением</strong></span>
</p>

<p>
	Одна из причин почему Centos8 а не Centos7, хотя у последнего поддержка до 2024 года, это то что установка php упростилась, т.к. в репозиториях уже есть версия 7.2 и обновить её, не составит большого труда. Можно конечно сразу поставить 7.4, но я хочу всё таки рассказать про процесс обновления. Поэтому вначала устанавливаем php 7.2 и наверно всё что может понадобится для полноценной CMS или того же Nextcloud
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">dnf install php php-cli php-mysqlnd php-json php-gd php-ldap php-odbc php-pdo php-opcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip</span></pre>

<p>
	после чего перезапускаем apache
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">systemctl restart httpd</span></pre>

<p>
	и для проверки работоспособности создадим info файл. Он нам ещё может пригодиться. 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">nano /home/sites/site1.ru/www/info.php</span></pre>

<p>
	со следующим содержимым
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pun">&lt;?</span><span class="pln">php phpinfo</span><span class="pun">();</span><span class="pln"> </span><span class="pun">?&gt;</span></pre>

<p>
	И выдадим права на файл
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">chown apache. /home/sites/site1.ru/www/info.php</span></pre>

<p>
	Теперь заходим через браузер на наш сайт с указанием к какому файлу обратиться, а именно info.php и мы увидем тестовую страницу php с номером версии и со всеми параметрами и настройками. 
</p>

<p>
	Посмотрели? А теперь обновим версию php до 7.4. Для этого подключим репозиторий
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm</span></pre>

<p>
	отключим 7.2
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">dnf module reset php:7.2</span></pre>

<p>
	подключим 7.4
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">dnf module enable php:remi-7.4</span></pre>

<p>
	и запускаем обновление
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">dnf update</span></pre>

<p>
	перезапустим на всякий случай apache
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">systemctl restart apache</span></pre>

<p>
	и проверим ранее созданый файл info.php. Теперь он должен выглядеть примерно так: 
</p>

<p style="text-align:center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://blog.ya-hz.ru/uploads/monthly_2021_10/image.png.ba55f8f3352aeb4c3134ac342ea67dda.png" data-fileid="31" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="31" data-ratio="87.51" width="857" alt="image.thumb.png.1aeab2c122cc595949da662d1a72763c.png" data-src="https://blog.ya-hz.ru/uploads/monthly_2021_10/image.thumb.png.1aeab2c122cc595949da662d1a72763c.png" src="https://blog.ya-hz.ru/applications/core/interface/js/spacer.png" /></a>
</p>

<p>
	Так же для работы некоторых CMS рекомендую изменить некоторые значения файла /etc/php.ini
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">max_execution_time 60
max_file_uploads 200
post_max_size 100
upload_max_filesize 100</span></pre>

<p>
	думаю что за что отвечает и так понятно. Можно конечно оставить как есть, но тогда вы столкнётесь с проблемой загрузки файлов через сайт, т.к. ограничение 2мб.
</p>

<p>
	<span style="font-size:18px;"><strong>Установка mariadb</strong></span>
</p>

<p>
	Теперь установим БД. Я, как и многие наверно, предпочитаю форк mysql - mariadb. Вот его ставить и будем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">dnf install mariadb mariadb-server</span></pre>

<p>
	сразу после установки запускаем и добавляем в автозагрузку
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">systemctl start mariadb
systemctl enable mariadb</span></pre>

<p>
	и запускаем скрипт начальной конфигурации
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">/usr/bin/mysql_secure_installation</span></pre>

<p>
	скрипт простой и интуитивно понятный, поэтому на нём останавливаться не буду. После того как с ним закончили, перезапускаем mariadb
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">systemctl restart mariadb</span></pre>

<p>
	<span style="font-size:18px;"><strong>Установка ssl сертификата Lets Encrypt</strong></span>
</p>

<p>
	Процедура так же проста, и не требует особых навыков. Для начала установим пакет certbot
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">dnf install epel-release
dnf install certbot</span></pre>

<p>
	Сразу запустить certbot не получится, будет ругаться. Поэтому создадим самоподписанный сертификат
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/pki/tls/private/localhost.key -out /etc/ssl/certs/localhost.crt</span></pre>

<p>
	и перезапустим apache
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">apachectl restart</span></pre>

<p>
	и запустим certbot
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">certbot certonly</span></pre>

<p>
	Сразу скажу, что для получения сертификата, сервер должен видеться из интернета и у вас должен быть рабочий домен прикрученный к серверу. т.е. сервре должен резолвиться извне. 
</p>

<p>
	После запуска выбирайте способ аутентификации
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">Apache Web Server plugin (apache)</span></pre>

<p>
	если он не доступен то тогда 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">Place files in webroot directory (webroot)</span></pre>

<p>
	Во втором случае, нужно на всякий выдать права 777 на директорую с сайтом. После того как сертификат будет получен, можно вернуть всё обратно. 
</p>

<p>
	Теперь отредактируем конфиг нашего сайта, чтобы он работал по https. Приведём его к такому виду
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;VirtualHost</span><span class="pln"> *:80</span><span class="tag">&gt;</span><span class="pln">

    ServerName site1.ru
    ServerAlias www.site1.ru
    Redirect permanent / https://site1.ru

</span><span class="tag">&lt;/VirtualHost&gt;</span><span class="pln">

</span><span class="tag">&lt;VirtualHost</span><span class="pln"> *:443</span><span class="tag">&gt;</span><span class="pln">

    ServerName site1.ru
    ServerAlias www.site1.ru
    DocumentRoot /home/sites/site1.ru/www

    ErrorLog /home/sites/site1.ru/log/error.log
    CustomLog /home/sites/site1.ru/log/access.log common

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/site1.ru/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/site1.ru/privkey.pem

    </span><span class="tag">&lt;Directory</span><span class="pln"> </span><span class="pun">/</span><span class="atn">home</span><span class="pun">/</span><span class="atn">sites</span><span class="pun">/</span><span class="atn">site1</span><span class="pln">.</span><span class="atn">ru</span><span class="pun">/</span><span class="atn">www</span><span class="tag">&gt;</span><span class="pln">
        Options FollowSymLinks
        AllowOverride All
        Require all granted
    </span><span class="tag">&lt;/Directory&gt;</span><span class="pln">
  
</span><span class="tag">&lt;/VirtualHost&gt;</span></pre>

<p>
	Проверяем конфиг на то что в нём нет ошибок
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">apachectl -t</span></pre>

<p>
	и перезапускаем apache
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">systemctl restart httpd</span></pre>

<p>
	Готово. Сертификат выдан на 3 месяца, и чтобы не забыть его обновить - процесс перевыпуска можно добавить в cron
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">30 4 * * * root /usr/bin/certbot renew --post-hook "/usr/sbin/apachectl restart" &gt;&gt; /var/log/le-renew.log</span></pre>

<p>
	каждый день в 4-30 будет запускаться попытка перевыпустить сертификат, и до тех пор пока он будет считаться новым (если не ошибаюсь 2 месяца) то ничего не будет происходить и в логах вы будет видеть примерно следующее с ообщение
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">[root@web ~]# tail -f /var/log/le-renew.log
Certificate not yet due for renewal

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
The following certificates are not due for renewal yet:
  /etc/letsencrypt/live/site1/fullchain.pem expires on 2022-01-11 (skipped)
  /etc/letsencrypt/live/site2/fullchain.pem expires on 2022-01-11 (skipped)
  /etc/letsencrypt/live/site3/fullchain.pem expires on 2022-01-11 (skipped)
No renewals were attempted.
No hooks were run.</span></pre>

<p>
	Вот на этом всё. Это полноценный сервер который позволит держать несколько сайтов, нужно только создать для них директории в /home/sites и конфиги в /etc/httpd/conf.d/. У меня на это веб-сервере крутиться собственно данный сайт, а так же облако, и pma. Для облака нужно было ещё пару модулей доставить и настроить cron, но это уже совсем отдельная статья. 
</p>
]]></description><guid isPermaLink="false">8</guid><pubDate>Mon, 18 Oct 2021 18:37:13 +0000</pubDate></item><item><title>&#x417;&#x430;&#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43E;&#x43A; HTTP &#xAB;Strict-Transport-Security&#xBB;</title><link>https://blog.ya-hz.ru/index.php?/articles.html/%D0%BF%D0%BE%D1%81%D1%82%D0%B8%D0%BD%D0%B3/nix/%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BE%D0%BA-http-%C2%ABstrict-transport-security%C2%BB-r17/</link><description><![CDATA[
<p><img src="https://blog.ya-hz.ru/uploads/monthly_2021_11/NDY-Blog-HSTS.png.0018090ac2af02ace01e5b0db209a096.png" /></p>
<p>
	После очередного обновления Nextcloud столкнулся с проблемой
</p>

<p>
	Заголовок HTTP «Strict-Transport-Security» должен быть настроен как минимум на «15552000» секунд
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">Заголовок HTTP «Strict-Transport-Security» должен быть настроен как минимум на «15552000» секунд</span></pre>

<p>
	Точнее даже не проблема, а рекомендация от разработчиков. Т.к. я люблю зелёную галочку, то нужно это исправить. Для этого в вайле .htaccess в корневой папке вашего облака, в отсеке с портом <span>:443</span> нужно прописать следующее: 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;IfModule</span><span class="pln"> </span><span class="atn">mod_headers</span><span class="pln">.</span><span class="atn">c</span><span class="tag">&gt;</span><span class="pln">
    Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
</span><span class="tag">&lt;/IfModule&gt;</span></pre>

<p>
	Но я это сделал в конфиге апача для виртуального хоста с облаком. Тоже пойдёт. В общем выбирайте любой способ и радуйтесь зелёной галочке как я
</p>

<p style="text-align:center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://blog.ya-hz.ru/uploads/monthly_2021_11/image.png.0f3f37a611195ed90a1089263b1f588d.png" data-fileid="51" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="51" data-ratio="35.00" width="1000" alt="image.thumb.png.6300110e32cac56a2d2bc57589e20527.png" data-src="https://blog.ya-hz.ru/uploads/monthly_2021_11/image.thumb.png.6300110e32cac56a2d2bc57589e20527.png" src="https://blog.ya-hz.ru/applications/core/interface/js/spacer.png" /></a>
</p>
]]></description><guid isPermaLink="false">17</guid><pubDate>Thu, 25 Nov 2021 14:31:31 +0000</pubDate></item><item><title>FreeBSD | &#x420;&#x430;&#x441;&#x448;&#x438;&#x440;&#x44F;&#x435;&#x43C; &#x434;&#x438;&#x441;&#x43A;</title><link>https://blog.ya-hz.ru/index.php?/articles.html/%D0%BF%D0%BE%D1%81%D1%82%D0%B8%D0%BD%D0%B3/nix/freebsd-%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D1%8F%D0%B5%D0%BC-%D0%B4%D0%B8%D1%81%D0%BA-r22/</link><description><![CDATA[
<p><img src="https://blog.ya-hz.ru/uploads/monthly_2021_12/475171_freebsd-6-1a-by-tuxq-on-deviantart_1600x1200_h.png.e4427c25e536345a48c606290b773f34.png" /></p>
<p>
	У меня в виртуалке крутится старенький сервер с мускулем на FreeBSD. Он в работе постоянно, и там постоянно заканчивается место. Я переодически его увеличию, благо это не так сложно. Вот решил поделиться способом. Ясли у меня 6.5 а FreeBSD 11.1. Но не думаю что на других версиях будет как то отличаться.
</p>

<p>
	И так первое что мы делаем это бекапим сервер. Обычно делаю снапшот средствами ESXi, но можно и просто склонировать сервак. Можно стопнуть его, и скопировать. В общем сами решайте
</p>

<p>
	После того как сделали бекап - добавим не много места жесткому диску серверу, увеличив дисковое пространство в яслях.
</p>

<p style="text-align:center;">
	<img alt="image.png.9978cb7154d0333edf5992e4c4ff400e.png" class="ipsImage ipsImage_thumbnailed" data-fileid="58" data-ratio="64.55" style="height:auto;" width="773" data-src="https://blog.ya-hz.ru/uploads/monthly_2021_12/image.png.9978cb7154d0333edf5992e4c4ff400e.png" src="https://blog.ya-hz.ru/applications/core/interface/js/spacer.png" />
</p>

<p>
	Перезагрузим сервер 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">reboot</span></pre>

<p>
	После ребута проверим что у нас там с дисковым пространством
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">gpart show da1</span></pre>

<p>
	Вывод будет примерно следующий: 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">34  16777149  da1  GPT  (16G) [CORRUPT]
34  16777149    1  freebsd-ufs  (8G)</span></pre>

<p>
	Коррупт! Аяяяй, Но ничего страшного. Запускаем рековер
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">gpart recover da1</span></pre>

<p>
	смотрим починилось ли
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">gpart show da1</span></pre>

<p>
	вывод будет примерно следующий
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">34  33554365  da1  GPT  (16G)
34  16777149    1  freebsd-ufs  (8G)
16777183  16777216       — free —  (8.0G)</span></pre>

<p>
	Всё пачинилось! Теперь расширяем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">gpart resize -i 1 da1</span></pre>

<p>
	ну и расширяем саму ФС
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">growfs /dev/da1p1</span></pre>

<p>
	Вот и всё. 
</p>
]]></description><guid isPermaLink="false">22</guid><pubDate>Mon, 20 Dec 2021 16:06:19 +0000</pubDate></item><item><title>Nextcloud | &#x412; &#x431;&#x430;&#x437;&#x435; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43E;&#x442;&#x441;&#x443;&#x442;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x442; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x438;&#x43D;&#x434;&#x435;&#x43A;&#x441;&#x44B;</title><link>https://blog.ya-hz.ru/index.php?/articles.html/%D0%BF%D0%BE%D1%81%D1%82%D0%B8%D0%BD%D0%B3/nix/nextcloud-%D0%B2-%D0%B1%D0%B0%D0%B7%D0%B5-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%BE%D1%82%D1%81%D1%83%D1%82%D1%81%D1%82%D0%B2%D1%83%D1%8E%D1%82-%D0%BD%D0%B5%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B-r23/</link><description><![CDATA[
<p><img src="https://blog.ya-hz.ru/uploads/monthly_2021_12/Nextcloud_Logo_White-1.jpg.a384a601017dedb493eb5c004e426e55.jpg" /></p>
<p>
	Обновился nextcloud до версии 23. Апдейт вышел уже какое то время назад, но у меня только щас руки дошли до него. И как обычно это бывает после обновления не всё гладко. 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">Nextcloud ошибка: «В базе данных отсутствуют некоторые индексы. Так как создание таких индексов может занять достаточно продолжительное время, оно должно быть запущено вручную.</span></pre>

<p>
	Решается всё просто. Нужно выполнить команду из под пользователя веб сервера. В моём случае это apache
</p>

<p>
	В консоли переходим в папку с файлами Nextcloud и прописываем следующее: 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">sudo -u apache php occ db:add-missing-indices</span></pre>

<p>
	Вот и всё
</p>
]]></description><guid isPermaLink="false">23</guid><pubDate>Mon, 20 Dec 2021 17:55:17 +0000</pubDate></item><item><title>CentOS 7 | &#x41D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x430; &#x441;&#x43E;&#x431;&#x44B;&#x442;&#x438;&#x439; &#x43D;&#x430; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435; &#x43F;&#x43E; &#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x438;. &#x423;&#x442;&#x438;&#x43B;&#x438;&#x442;&#x430; cron</title><link>https://blog.ya-hz.ru/index.php?/articles.html/%D0%BF%D0%BE%D1%81%D1%82%D0%B8%D0%BD%D0%B3/nix/centos-7-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D0%B9-%D0%BD%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5-%D0%BF%D0%BE-%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8-%D1%83%D1%82%D0%B8%D0%BB%D0%B8%D1%82%D0%B0-cron-r24/</link><description><![CDATA[
<p><img src="https://blog.ya-hz.ru/uploads/monthly_2021_12/hero.png.c5ec60718df892a56bf8c2f4dfe45f74.png" /></p>
<p class="AMB_Message AMB_Message_information" style="line-height:18px;">
	Статья подойдёт и для Centos 8. 
</p>

<p>
	Cron — классический демон, использующийся для периодического выполнения заданий в определённое время. Регулярные действия описываются инструкциями, помещенными в файлы crontab и в специальные каталоги.
</p>

<p>
	Системный демон crond предназначен для выполнения регулярно повторяющихся заданий. Обычно crond запускается как системный сервис в процессе начальной загрузки системы и остается активным пока система не выключена. Сразу после старта он просматривает каталоги /var/spool/cron и /etc/cron.d, а также файл /etc/crontab в поисках заданий, которые нужно выполнять. Затем crond просыпается каждую минуту, выполняет предписанные ему задания и снова засыпает до начала следующей минуты.
</p>

<p>
	Посмотреть версию своего cron можно с помощью команды:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">sudo rpm -q cronie</span></pre>

<div class="ipsSpoiler" data-ipsspoiler="" data-ipsspoiler-option="Картинка">
	<div class="ipsSpoiler_header">
		<span>Спойлер</span>
	</div>

	<div class="ipsSpoiler_contents">
		<p>
			<img alt="image.png.18cd2927f751a49ab64113e709fde79c.png" class="ipsImage ipsImage_thumbnailed" data-fileid="59" data-ratio="24.89" style="height:auto;" width="225" data-src="https://blog.ya-hz.ru/uploads/monthly_2021_12/image.png.18cd2927f751a49ab64113e709fde79c.png" src="https://blog.ya-hz.ru/applications/core/interface/js/spacer.png" />
		</p>
	</div>
</div>

<p>
	Если он не установлен, вы можете использовать yum, чтобы установить его.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">sudo yum -y install cronie</span></pre>

<p>
	Задания cron выбраны службой crond.
</p>

<p>
	Для того, чтобы проверить, работает ли служба crond на вашем CentOS 7, вы можете использовать следующую команду:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">sudo systemctl status crond.service -l</span></pre>

<p>
	Для реализации данного способа требуется внести задачу скрипта skript.sh в каталоге /sh/skriptiki/ на исполнение в программу cron на сервере CentOS 7.
</p>

<p>
	Проверим, работает ли у нас вообще cron в фоновом режиме?
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">ps -ef | grep cron</span></pre>

<div class="ipsSpoiler" data-ipsspoiler="" data-ipsspoiler-option="Вывод команды">
	<div class="ipsSpoiler_header">
		<span>Спойлер</span>
	</div>

	<div class="ipsSpoiler_contents">
		<p>
			<img alt="image.png.5b851925d80ca4406836e4ae16fa3ee2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="60" data-ratio="11.18" style="height:auto;" width="617" data-src="https://blog.ya-hz.ru/uploads/monthly_2021_12/image.png.5b851925d80ca4406836e4ae16fa3ee2.png" src="https://blog.ya-hz.ru/applications/core/interface/js/spacer.png" />
		</p>
	</div>
</div>

<p>
	Открываем файл заданий cron:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">nano /etc/crontab</span></pre>

<p>
	Добавляем строки по смыслу общего синтаксиса в файле.
</p>

<p>
	После того, как вы сделаете изменения перезапустите службу crond с помощью команды ниже:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">sudo systemctl restart crond.service</span></pre>

<p>
	<strong>Шаблоны задания.</strong>
</p>

<p>
	Файлы crontab, создаваемые для отдельных пользователей, находятся в каталоге /usr/spool/cron/crontabs/ или /var/spool/cron/tabs/. Редактировать их вручную не рекомендуется, для этого используют команду crontab -e. Файлы crontab, используемые для управления всей системой, располагаются в каталоге /etc/cron.d/. Кроме того, в каталогах /etc/cron.daily/, /etc/cron.weekly/ и /etc/cron.monthly/ размещаются автоматически запускаемые программы (ежедневно, еженедельно или ежемесячно).
</p>

<p>
	Каждый пользователь системы имеет свой файл заданный crontab, в котором описано, в какое время и какие программы запускать от имени этого пользователя. Для редактирования файла crontab используется специальная одноимённая программа crontab, позволяющая не прерывать процесс cron на время редактирования.
</p>

<p>
	Чтобы задать cron‘у задачу лучше всего воспользоваться командой crontab, если выполнить ее с опцией -l.
</p>

<p>
	Для отображения содержимого crontab-файла текущего пользователя используйте команду:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">crontab -l</span></pre>

<p>
	Будет выведен текущий список заданий. Если вы еще никаких заданий cron‘у не давали, вы увидите в ответ сообщение «no crontab for user«.
</p>

<p>
	Сформулировать cron‘у задачу довольно просто, но, прежде чем пытаться задать ему работу, установите в качестве значения переменной окружения EDITOR указание на любимый (или привычный) текстовый редактор. В противном случае будет вызван редактор vi, с которым я, например, не привык работать.
</p>

<p>
	Поэтому я обычно выполняю команду:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">export EDITOR=mcedit</span></pre>

<p class="AMB_Message AMB_Message_information" style="line-height:18px;">
	Необязательно использовать mcedit. Можно то что удобнее, например тот же nano
</p>

<p>
	После чего получаю возможность использовать для редактирования списка заданий привычный CoolEdit из пакета Midnight Commander.
</p>

<p>
	После задания значения переменной EDITOR можно выполнить команду для редактирования заданий пользователя:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">crontab -e</span></pre>

<p>
	Будет вызван указанный вами редактор, причем при первом запуске такой команды откроется пустое окно, в котором вы должны сформулировать задание cron‘у. Возникает вопрос: а что мешает нам просто запустить любимый редактор, открыть для редактирования нужный файл и внести в него необходимые команды? Этому существует две причины.
</p>

<p>
	Во-первых, файлы, которые хранят задания для cron‘а (crontab-файлы), принадлежат root-у и защищены от модификации простыми пользователями. Команда же crontab запускается от имени root‘а (для нее установлен так называемый setuid-бит) и имеет доступ к этим файлам. Конечно, если речь идет о вашем персональном компьютере, где вы имеете все права, вам законы не писаны, но лучше все же придерживаться принятых правил игры.
</p>

<p>
	Вторая причина состоит в том, что записи в crontab-файлах должны подчиняться определенным стандартам, быть формализованы, чтобы crond мог их правильно интерпретировать. Команда crontab после того, как вы сохранили вновь отредактированный файл, производит его синтаксический анализ, и, если вы сделали какую-то ошибку, предлагает вам вернуться к его редактированию. Конечно, crontab не может сформулировать за вас задание cron‘у, так что правила написания заданий вам необходимо знать.
</p>

<p>
	Давайте их рассмотрим.
</p>

<p>
	Каждая строка crontab-файла (кроме строк комментариев, которые обозначаются знаком # в первой позиции) либо устанавливает значение некоторой переменной, либо представляет отдельное задание (ниже приведен пример crontab-файла, можете просмотреть его, чтоб составить первое впечатление).
</p>

<p>
	Строка задания состоит из шести полей, разделяемых пробелами (по крайней мере одним). Первые пять полей отведены для указания времени выполнения задания. В следующей табличке представлены значения, которые можно придавать этим полям.
</p>

<p style="text-align:center;">
	<img alt="image.png.c5ca70774de824e279c23a0766f79163.png" class="ipsImage ipsImage_thumbnailed" data-fileid="61" data-ratio="24.19" style="height:auto;" width="707" data-src="https://blog.ya-hz.ru/uploads/monthly_2021_12/image.png.c5ca70774de824e279c23a0766f79163.png" src="https://blog.ya-hz.ru/applications/core/interface/js/spacer.png" />
</p>

<p>
	Шаблон задания для cron выглядит примерно так:
</p>

<ul>
	<li>
		Минуты (0-59);
	</li>
	<li>
		Часы (0-24);
	</li>
	<li>
		День месяца (1-31);
	</li>
	<li>
		Месяц (1-12) — или три первых буквы английского названия месяца (регистр не имеет значения);
	</li>
	<li>
		День недели (0-7) — или три первых буквы английского названия дня недели (регистр не имеет значения, а числа 0 и 7 оба обозначают воскресенье);
	</li>
</ul>

<p>
	Команда.
</p>

<p>
	В каждом из этих полей вместо простого числового значения можно прописать:
</p>

<ul>
	<li>
		список возможных значений, разделенных запятыми (в списках можно использовать только числа, имена не допускаются);
	</li>
	<li>
		интервал значений (например, 1-3);
	</li>
	<li>
		или звездочку (*), обозначающую любое из допустимых значений для данного поля.
	</li>
</ul>

<p>
	Существует также возможность указать, что данное задание должно выполняться только в каждый n-ый час (минуту, день или месяц), для чего в нужном поле записывают примерно такую комбинацию: «*/n» (кавычки, конечно, нужно опустить, а вместо n поставить конкретное число). Эти варианты записи времени выполнения заданий можно комбинировать, но об этом лучше прочитайте на man-странице crontab.
</p>

<p>
	Обратите внимание на то, что для указания дня отведено 2 поля: третье и пятое. Если в обоих полях заданы значения, отличные от *, то задание будет выполняться в те дни, когда хотя бы одно из значений дня совпадает с текущим. Например, если в третьем поле стоит 1,15, а в пятом поле — 5 (или FRI), то задание будет выполняться по первым и пятнадцатым числам каждого месяца, а также каждую пятницу (конечно, если в поле месяцев будет стоять *).
</p>

<p>
	Следующее поле (шестое) содержит подлежащую выполнению командную строку оболочки shell. Считается, что поле команда продолжается до конца строки и может содержать пробелы и символы табуляции. Причем заключать эту командную строку в кавычки не требуется. Как и в обычной командной строке shell, можно указать в этом поле несколько команд, разделенных точкой с запятой (хотя, наверное, лучше написать командный файл и указать в crontab-файле его имя).
</p>

<p>
	Задание переменных окружения для cron рассмотрим на примере переменной MAILTO. Надо сказать, что по умолчанию после выполнения каждой строки crontab-файла cron отсылает рапорт о выполнении задания. Содержанием такого рапорта является вывод исполнявшихся команд. Если не задавать переменную MAILTO, то сообщение отправляется тому пользователю, который задал ему данную задачу. Если вы хотите, чтобы сообщения отправлялись не вам, а, скажем, пользователю с именем fred, то в crontab-файле надо записать строку вида:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">MAILTO="fred"</span></pre>

<p>
	Боюсь только, что fred не обрадуется, если его почтовый ящик будет заполняться сообщениями от cron. Если они не нужны и вам, то установите переменную MAILTO в нуль:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">MAILTO=""</span></pre>

<p>
	После чего cron не будет загружать вас лишними письмами. Несколько переменных окружения cron устанавливает автоматически при его запуске.
</p>

<p>
	После завершения редактирования вы, как обычно, сохраняете результаты и выходите из редакторской программы.
</p>

<p>
	Если вы сделали ошибки, то увидите такое сообщение:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">crontab -e</span></pre>

<p>
	Ответ:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">crontab: installing new crontab
"/tmp/crontab.10348":0: bad day-of-week
errors in crontab file, can't install.
Do you want to retry the same edit? y</span></pre>

<p>
	Естественно, придется ответить y.
</p>

<p>
	Если же ошибок не было (или вы их исправили), вы увидите только одну строку:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">crontab -e</span></pre>

<p>
	Ответ:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">crontab: installing new crontab</span></pre>

<p>
	В отличие от других процессов-демонов, которые требуют перезапуска после редактирования их конфигурационных файлов, перезапускать процесс crond после того, как пользователь задал новое задание, не требуется. Дело в том, что просыпаясь ежеминутно, cron проверяет время модификации crontab-файлов и перечитывает те файлы заданий, которые изменялись в последнее время. Поэтому не более чем через минуту ваши задания будут «приняты к исполнению«.
</p>

<p>
	Пользоваться услугами crond могут все пользователи, зарегистрированные в системе. Правда, суперпользователь может закрыть эту возможность для некоторых пользователей, прописав их имена в специальный файл /etc/cron.deny, либо же разрешив использовать cron только ограниченному числу пользователей, имена которых перечислены в файле /etc/cron.allow.
</p>

<p>
	Подробнее об этом вы можете прочитать на man-странице crontab, а пока будем считать, что вам такое право предоставлено.
</p>

<p>
	Чтобы изменить crontab-файл другого пользователя (например, bitrix):
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">crontab -u bitrix -e</span></pre>

<p>
	Команда для очистки всех заданий текущего пользователя:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">crontab -r</span></pre>

<p>
	Команда для просмотра краткой справки по установленным таймерам:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">systemctl list-timers</span></pre>

<p>
	 
</p>

<div class="ipsSpoiler" data-ipsspoiler="" data-ipsspoiler-option="Ответ:">
	<div class="ipsSpoiler_header">
		<span>Спойлер</span>
	</div>

	<div class="ipsSpoiler_contents">
		<p>
			<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="62" href="https://blog.ya-hz.ru/uploads/monthly_2021_12/image.png.fe5251e20bcdcd6704ac07bbf016d17a.png" rel=""><img alt="image.thumb.png.61c1ec1f8dc15ab6c6c7ace4521b0bba.png" class="ipsImage ipsImage_thumbnailed" data-fileid="62" data-ratio="12.80" style="height:auto;" width="1000" data-src="https://blog.ya-hz.ru/uploads/monthly_2021_12/image.thumb.png.61c1ec1f8dc15ab6c6c7ace4521b0bba.png" src="https://blog.ya-hz.ru/applications/core/interface/js/spacer.png" /></a>
		</p>
	</div>
</div>

<p>
	Команда чтобы увидеть загруженные, но неактивные таймеры:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">systemctl list-timers --all</span></pre>

<p>
	 
</p>

<p>
	<strong>Где хранятся crontab-файлы?</strong>
</p>

<p>
	Дело в том, что одного такого файла нет. В GNU/Linux имеется целый каталог /var/spool/cron, в котором хранятся crontab-файлы для всех пользователей, включая root-а. Каждый такой файл имеет имя, совпадающее с регистрационным именем пользователя, по которому процесс cron определяет, какой UID надо использовать при выполнении команд из этого файла. Владельцем всех этих файлов является пользователь root.
</p>

<p>
	Кроме личных crontab-файлов отдельных пользователей существует также общесистемные crontab-файлы. Один из них, /etc/crontab, находится в каталоге /etc, а остальные — в каталоге /etc/cron.d. Эти файлы не доступны через команду crontab, редактировать их может только суперпользователь. Структура записей в таких файлах тоже несколько отличается от описанной выше: в строках заданий используется дополнительное поле, расположенное перед полем команды. В этом дополнительном поле суперпользователь задает имя пользователя, чей идентификатор (UID) будет использоваться при запуске данного задания.
</p>

<p>
	При инсталляции дистрибутива CentOS 7 создается основной файл конфигурации cron, /etc/crontab, и выглядит примерно так — формат cronjob-выражения:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly</span></pre>

<p>
	 
</p>

<p>
	, где
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">минута час день месяц день_недели /путь/к/исполняемому/файлу</span></pre>

<p>
	 
</p>

<p>
	и звёздочками обозначены конкретные блоки времени.
</p>

<p class="AMB_Message AMB_Message_tip" style="line-height:18px;">
	Внимание! Каждая запись в файле crontab должна оканчиваться символом перевода строки, в том числе и последняя. В противном случае cron игнорирует её и записывает предупреждение в системный журнал, а ваш скрипт даже не срабатывает!
</p>

<p>
	 
</p>

<div class="ipsSpoiler" data-ipsspoiler="" data-ipsspoiler-option="Пример:">
	<div class="ipsSpoiler_header">
		<span>Спойлер</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">1 * * * * root /usr/bin/bash /root/mpstat.sh &gt; /dev/null 2&gt;&amp;1
[перевод строки]
[перевод строки]</span></pre>
	</div>
</div>

<p>
	Команда run-parts в нем служит для запуска всех скриптов из каталога, указанного в виде параметра этой команды.
</p>

<p>
	По большей части эти скрипты выполняют функции по обслуживанию системы: удаляют ненужные временные файлы, присматривают за быстро растущими файлами протоколов в каталоге /var/log и, при необходимости, очищают их, и тому подобное.
</p>

<p>
	Обратите внимание на то, что все эти работы, кроме ежечасных, выполняются в 4 часа ночи. Разработчики дистрибутива, по-видимому, имели в виду в первую очередь круглосуточно работающие сервера и установили время выполнения заданий на тот период, когда активность системы минимальна. Ведь большинство этих скриптов интенсивно работают с диском, что может существенно затормозить работу пользователей. Однако такое решение скорее всего непригодно для персонального компьютера, который пока что принято выключать на ночь. Однако, оказывается, что разработчики дистрибутива предусмотрели возможность выключения компьютера на ночь и поручили выполнение некоторых необходимых работ еще и демону anacron.
</p>

<p>
	<strong>Невыполненные задания и утилита anacron.</strong>
</p>

<p>
	Если некоторое задание не было выполнено демоном crond в указанное время, например, компьютер был выключен, то процесс crond не выполняет такую команду позже, поскольку информация о невыполнении задания ему не поступает, а для некоторых системных заданий такое явление недопустимо.
</p>

<p>
	Эту проблему позволяет решить другой системный демон, имя которого anacron.
</p>

<p>
	В отличие от cron, он работает по следующему принципу:
</p>

<ul>
	<li>
		При запуске, а запускается он во время старта системы из инициализационных скриптов, он просматривает свой конфигурационный файл, обычно /etc/anacrontab, в котором для каждого задания указывается периодичность, в сутках, с которой должно повторяться выполнение этого задания.
	</li>
	<li>
		Далее anacron проверяет, выполнялось ли данное задание в течение последних n дней. Если нет, anacron запускает на выполнение команду, указанную в строке задания. При этом выполнение команды может осуществляться с некоторой задержкой, величина которой, в минутах, должна быть указана в строке задания.
	</li>
	<li>
		После выполнения задания anacron записывает дату выполнения в специальный файл, содержащий записи о времени последнего выполнения данного задания, чтобы знать, когда надо выполнять это задание снова. Эти файлы сохраняются в каталоге /var/spool/anacron. В файл записывается только дата, часы и минуты не запоминаются.
	</li>
	<li>
		После выполнения каждого задания anacron посылает сообщение о его выполнении системному демону протоколирования syslogd, а после выполнения всех заданий из конфигурационного файла заканчивает работу.
	</li>
</ul>

<p>
	Конфигурационный файл /etc/anacrontab может содержать строки трех типов:
</p>

<ul>
	<li>
		строки описания заданий,
	</li>
	<li>
		строки задания переменных окружения,
	</li>
	<li>
		строки комментариев.
	</li>
</ul>

<p>
	Строка описания заданий имеет следующий формат:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">период задержка идентификатор_задания команда</span></pre>

<p>
	Как уже говорилось, период задается в днях, а задержка — в минутах. Идентификатор задания может содержать любые символы, кроме пробелов и слэшей. Он используется для идентификации задания при формировании сообщений демону протоколирования и при запоминании времени выполнения задания. В качестве команды может использоваться любая команда оболочки.
</p>

<p>
	Строки задания переменных имеют стандартный формат:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">ИМЯ_ПЕРЕМЕННОЙ = ЗНАЧЕНИЕ</span></pre>

<p>
	В качестве строк комментария может выступать пустая строка, строка состоящая только из пробелов или строка, содержащая произвольную последовательность символов, начинающуюся символом ‘#‘, перед которым может стоять любое количество пробелов.
</p>

<p>
	Приведу в качестве примера файл /etc/anacrontab из стандартной установки дистрибутива CentOS 7:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">cat /etc/anacrontab</span></pre>

<div class="ipsSpoiler" data-ipsspoiler="" data-ipsspoiler-option="Ответ">
	<div class="ipsSpoiler_header">
		<span>Спойлер</span>
	</div>

	<div class="ipsSpoiler_contents">
		<p>
			<img alt="image.png.791b242df22e9cff12b709e8ec24c036.png" class="ipsImage ipsImage_thumbnailed" data-fileid="63" data-ratio="46.32" style="height:auto;" width="585" data-src="https://blog.ya-hz.ru/uploads/monthly_2021_12/image.png.791b242df22e9cff12b709e8ec24c036.png" src="https://blog.ya-hz.ru/applications/core/interface/js/spacer.png" />
		</p>
	</div>
</div>

<p>
	Как видно, в CentOS 7 утилита anacron «подстраховывает» демон cron, запуская периодические задания cron‘а, если последний почему-либо их не запускал. Благодаря этому, в частности, скрипт logrotate регулярно, точнее, при каждом запуске компьютера, выполняется, несмотря на то, что демоном crond он не запускается из-за выключения компьютера на ночь.
</p>

<p>
	Среди регулярно запускаемых cron‘ом скриптов, в каталогах /etc/cron.daily, /etc/cron.weekly и /etc/cron.monthly, вы найдете скрипт 0anacron, который заботится о том, чтобы обновить записи о времени последнего выполнения тех заданий, которые поручены обеим демонам, чтобы исключить их повторное выполнение anacron‘ом.
</p>

<p>
	При желании можно, очевидно, сделать так, чтобы cron, в свою очередь, «подстраховывал» anacron, периодически запуская его, хотя проще просто поручить периодические задания cron‘у.
</p>

<p>
	Демон anacron запускается при старте системы и, выполнив предписанные ему задания, завершает работу. Наверное поэтому нет никаких утилит, специально предназначенных для ввода новых заданий демону anacron. Такие задания может давать только суперпользователь путем прямого редактирования файла /etc/anacrontab. По-видимому, основное назначение этого демона — выполнять какие-то работы по обслуживанию системы после периодов долгого простоя.
</p>

<p>
	<strong>Примеры cron-заданий.</strong>
</p>

<p>
	Ниже приведены несколько примеров cron-заданий:
</p>

<ul>
	<li>
		Чтобы выполнять команду каждую минуту, задание должно быть такое:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">* * * * * &lt;исполняемая-команда&gt;</span></pre>

<ul>
	<li>
		Похожее задание, только команда будет вызываться каждые пять минут:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">*/5 * * * * &lt;исполняемая-команда&gt;</span></pre>

<ul>
	<li>
		Вызывать команду 4 раза в час (каждые 15 минут):
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">*/15 * * * * &lt;исполняемая-команда&gt;</span></pre>

<ul>
	<li>
		Чтобы выполнить команду каждый час в 30 минут, пишем:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">30 * * * * &lt;исполняемая-команда&gt;</span></pre>

<p class="AMB_Message AMB_Message_information" style="line-height:18px;">
	То есть команда будет выполняться не каждые 30 минут, а тогда, когда значение минут будет равно 30 (например, 10:30, 11:30, 12:30 и так далее).
</p>

<ul>
	<li>
		Значения времени можно комбинировать, перечислив их через запятую. Следующий код будет выполнять команду три раза в час: в 0, 5 и 10 минут.
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">0,5,10 * * * * &lt;исполняемая-команда&gt;</span></pre>

<ul>
	<li>
		Выполнять команду каждый час будет следующее задание:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">0 * * * * &lt;исполняемая-команда&gt;</span></pre>

<ul>
	<li>
		Выполнение команды каждые два часа:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">0 */2 * * * &lt;исполняемая-команда&gt;</span></pre>

<ul>
	<li>
		Чтобы выполнять команду каждый день (в 00:00):
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">0 0 * * * &lt;исполняемая-команда&gt;</span></pre>

<ul>
	<li>
		Выполнение команды каждый день в 03:00:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">0 3 * * * &lt;исполняемая-команда&gt;</span></pre>

<ul>
	<li>
		Выполнение команды каждое воскресенье (sunday):
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">0 0 * * SUN &lt;исполняемая-команда&gt;</span></pre>

<ul>
	<li>
		Другой вариант задания, которое будет выполнять команду каждое воскресенье (естественно, тоже в 00:00):
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">0 0 * * 0 &lt;исполняемая-команда&gt;</span></pre>

<ul>
	<li>
		Выполнение команды каждый день с понедельника по пятницу:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">0 0 * * 1-5 &lt;исполняемая-команда&gt;</span></pre>

<ul>
	<li>
		Следующее задание будет выполнять команду каждый месяц, 1-го числа в 00:00:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">0 0 1 * * &lt;исполняемая-команда&gt;</span></pre>

<ul>
	<li>
		Выполнять команду в 16:15 каждого первого числа месяца будет это задание:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">15 16 1 * * &lt;исполняемая-команда&gt;</span></pre>

<ul>
	<li>
		Выполнение команды каждые три месяца:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">0 0 1 */3 * &lt;исполняемая-команда&gt;</span></pre>

<ul>
	<li>
		Выполнение команды в строго определённое время и месяц:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">5 0 * 4 * &lt;исполняемая-команда&gt;</span></pre>

<ul>
	<li>
		Задание будет вызывать команду в начале каждого полугодия (в 00:00 1-го дня):
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">0 0 1 */6 * &lt;исполняемая-команда&gt;</span></pre>

<ul>
	<li>
		Выполнение команды каждый год 1-го января в 00:00:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">0 0 1 1 * &lt;исполняемая-команда&gt;</span></pre>

<p>
	<strong>Готовые cron-задания.</strong>
</p>

<ul>
	<li>
		@reboot запускать при начальной загрузке сервера;
	</li>
	<li>
		@yearly заменяет ‘0 0 1 1 *‘, то есть ‘ежегодно в 00:00 1 января‘;
	</li>
	<li>
		@annually тоже что и yearly&gt;;
	</li>
	<li>
		@monthly заменяет ‘0 0 1 * *‘ то есть ‘ежемесячно в 00:00 1 числа‘;
	</li>
	<li>
		@weekly заменяет ‘0 0 * * 0‘ то есть ‘еженедельно в 00:00 воскресенье‘;
	</li>
	<li>
		@daily заменяет ‘0 0 * * *‘ то есть ‘ежедневно в 00:00‘;
	</li>
	<li>
		@midnight тоже что и daily;
	</li>
	<li>
		@hourly заменяет ‘0 * * * *‘ то есть ‘ежечасно в 00 минут‘.
	</li>
</ul>

<p>
	Например: чтобы выполнять команду каждый раз после перезапуска сервера, используйте это задание.
</p>

<p>
	@reboot &lt;исполняемая-команда&gt;
</p>

<p>
	<strong>Настройка cron для web-программистов.</strong>
</p>

<p>
	Добавляем в cron задачу, которая будет выполнятся каждую минуту.
</p>

<p>
	Набираем:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">crontab -e</span></pre>

<p>
	И добавляем (будет выполняться под тем пользователем под кем вы зашли в SSH):
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">*/1 * * * * /usr/bin/php -q /server/cron/cron.php &gt; /dev/null 2&gt;&amp;1</span></pre>

<p>
	Сохраняемся, 
</p>

<p>
	Где:
</p>

<ul>
	<li>
		*/1 * * * * — означает что скрипт будет запускаться каждую минуту;
	</li>
	<li>
		&gt; /dev/null — означает отправку результатов, которые выдаст скрипт, в никуда;
	</li>
	<li>
		2&gt;&amp;1 — избавляет администратора сервера от писем, если скрипт закончит работу с ошибками.
	</li>
</ul>

<p>
	<strong>Для отправки на почту воспользуемся postfix.</strong>
</p>

<p>
	Как сделать возможность получать письма с сервера описано в статье: «CentOS 7: Postfix 3 для отправки электронной почты с внутреннего системного «почтового ящика».
</p>

<p>
	Набираем:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">crontab -e</span></pre>

<p>
	И добавляем (будет выполняться под тем пользователем под кем вы зашли в SSH):
</p>

<p>
	<strong>Выполнение команды архивирования материалов сайта и выгрузка базы данных каждый день с понедельника по пятницу с последующей отправкой файла результатов работы скрипта по указанной почте:</strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">0 0 * * 1-5 /usr/bin/bash /sh/directory.ru-backup-day.sh &gt; /tmp/backup-day.txt &amp;&amp; mail -s "Site directory.ru day rotate" admin@yandex.ru &lt; /tmp/backup-day.txt</span></pre>

<p>
	<strong>Выполнение команды сканирования открытых портов указанного IP-адреса, например, по воскресениям с последующей отправкой файла результатов работы nmap по указанной почте:</strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">0 0 * * SUN nmap -T4 -A -v 192.168.0.31 &gt; /tmp/nmap.txt &amp;&amp; mail -s "Nmap usage" admin@yandex.ru &lt; /tmp/nmap.txt</span></pre>

<p>
	<strong>Выполнение команды оценки занятого дискового пространства каждый день с последующей отправкой просто результатов работы nmap по указанной почте:</strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">0 0 * * * df -h | mail -s "Disk usage" admin@mail.ru</span></pre>

<p>
	Сохраняемся, 
</p>

<p>
	Добавляем в cron задачу, которая будет выполнятся, сохранит результат выполнения скрипта в файл и отправит его на почту с темой, в нашем случае в теле письма, но можно и приложением.
</p>

<p>
	<strong>Иногда надо запускать по cron скрипт который лежит уже на сайте и использует окружение сайта.</strong>
</p>

<p>
	Установим менеджер загрузок wget:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">yum -y install wget</span></pre>

<p>
	Набираем:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">crontab -e</span></pre>

<p>
	И добавляем (будет выполняться под тем пользователем под кем вы зашли в SSH):
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">*/5 * * * * /usr/bin/wget --no-check-certificate -O /dev/null https://www.linuxshop.ru/cronit.sh</span></pre>

<p>
	Сохраняемся, 
</p>

<p>
	Где:
</p>

<ul>
	<li>
		wget — как бы выкачивает скрипт (что нам и нужно web-сервер его исполняет);
	</li>
	<li>
		--no-check-certificate не проверять сертификат https;
	</li>
	<li>
		-O /dev/null — не сохранять выкаченный файл на жесткий диск.
	</li>
</ul>

<p>
	<strong>Настройка cron для системных администраторов.</strong>
</p>

<p>
	Фактически, cron — это сервис, как и большинство других сервисов CentOS 7, он запускается при старте системы и работает в фоновом режиме. Его основная задача выполнять нужные процессы в нужное время. Существует несколько конфигурационных файлов, из которых он берет из них информацию о том что и когда нужно выполнять. Сервис открывает файл /etc/crontab (тут могут быть тоже прописаны задачи) и они не будут отображаться по команде crontab –l.
</p>

<p>
	Так же существует anacron (anachronistic cron или асинхронный (анахроничный) cron) и его запуск и его задания тоже нужно учитывать, смотрите файл /etc/anacrontab и каталоги /etc/cron.daily/, /etc/cron.hourly/, /etc/cron.monthly/ и /etc/cron.weekly/.
</p>

<p>
	Часто, в современных дистрибутивах там прописан запуск утилиты run-parts, которая запускает нужные скрипты из следующих папок:
</p>

<ul>
	<li>
		/etc/cron.minutely — каждую минуту;
	</li>
	<li>
		/etc/cron.hourly — каждый час ещё cat /etc/cron.d/0hourly — тут настроен;
	</li>
	<li>
		/etc/cron.daily — каждый день;
	</li>
	<li>
		/etc/cron.weekly — каждую неделю;
	</li>
	<li>
		/etc/cron.monthly — каждый месяц.
	</li>
</ul>

<p>
	<strong>Список всех задач cron у всех пользователей.</strong>
</p>

<p>
	К сожалению для системного администратора нет такого инструмента, так как задачи в CentOS 7 могут храниться в нескольких местах:
</p>

<p>
	Клиентский crontab (# crontab -u user -l)
</p>

<ul>
	<li>
		/etc/crontab — можно посмотреть cat /etc/crontab;
	</li>
	<li>
		/etc/anacrontab — можно посмотреть cat /etc/anacrontab;
	</li>
	<li>
		/etc/cron.d/ — cron считывает файлы в каталоге /etc/cron.d/;
	</li>
	<li>
		/etc/cron.daily/ — запуск всех скриптов один раз в день;
	</li>
	<li>
		/etc/cron.hourly/ — запуск всех скриптов один раз в час;
	</li>
	<li>
		/etc/cron.monthly/ — запуск всех скриптов один раз в месяц;
	</li>
	<li>
		/etc/cron.weekly/ — запуск всех скриптов один раз в неделю.
	</li>
</ul>

<p>
	Иногда конкретные пользователи могут создавать задачи тоже, как описано в общих методах. Задания cron для конкретных пользователей расположены в /var/spool/cron/username. При создании задач для конкретных пользователей, вам не нужно указать имя пользователя в cron.
</p>

<p>
	Для того чтобы пройти руками все клиентские crontab (# crontab -u user -l), можно автоматизировать для всех пользователей очевидно нужно взять список пользователей в системе из /etc/passwd и сделать для каждого пользователя:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">crontab -u USERNAME -l</span></pre>

<p>
	, то есть:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">for user in $(cut -d':' -f1 /etc/passwd); do crontab -u $user -l; done</span></pre>

<p>
	Недостаток этого решения очевиден:
</p>

<ol>
	<li>
		Нужно всегда помнить эту команду.
	</li>
	<li>
		Если у пользователя нет задач в планировщике то мы получим сообщение «no crontab for vasua» и таких сообщений может быть десятки если у вас много пользователей — это неудобно.
	</li>
	<li>
		Вывод информации неудобно читать.
	</li>
</ol>

<p>
	Решение простое — создадим функцию allcrontab в файле ~/.bashrc для ввода информации в более удобном виде:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln"># Определим цвета вывода
red='\e[0;31m'
RED='\e[1;31m'
green='\e[0;32m'
GREEN='\e[1;32m'
NC='\e[0m'

# Определим нашу функцию вывода списка всех задач cron у всех пользователей
function allcrontab() {
  for user in $(cut -d':' -f1 /etc/passwd); do
   usercrontab=$(crontab -l -u ${user} 2&gt;/dev/null)
   if [ -n "${usercrontab}" ]; then
      echo -e "${RED}====== Start crontab for user ${NC}${GREEN}${user}${NC} ${RED}======${NC}"
      crontab -l -u ${user} | sed '/ *#/d; /^ *$/d'
      echo -e "${RED}====== End crontab for user ${NC}${GREEN}${user}${NC} ${RED}========${NC}\n"
   fi
  done
}</span></pre>

<p>
	Выполняем source ~/.bashrc или перелогиниваемся и выполняем в консоли allcrontab и видим красивый вывод списка всех задач cron у всех пользователей.
</p>

<p>
	Но это не финишная прямая, а только начало, ведь опытный системный администратор знает, что кроме вывода списка заданий командой # crontab -u user -l есть еще задания планировщика в каталоге /etc/cron.d/ и это тоже нужно учитывать, потому что например панель хостинга ISPConfig сохраняет задания cron в каталоге /etc/cron.d/ с именами ispc_webXXX, где webXXX — это логин системного пользователя, например web30 и вывод # crontab -u web30 -l нам скажет «no crontab for web30», а на самом деле в файле /etc/cron.d/ispc_web30 может быть такая картина:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">SHELL='/bin/sh'
*/2 * * * * web30 /usr/bin/php -f /var/www/mysite.ru/web/yii cron-origin/index</span></pre>

<p>
	Чтобы вывести список всех заданий cron от всех пользователей вашей системы создайте скрипт:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">#!/bin/bash
for user in $(cut -f1 -d: /etc/passwd)
do
  echo $user
  crontab -u $user -l
done</span></pre>

<p>
	Альтернативой вашей проблеме может быть размещение их в папке cron.d и указание соответствующего пользователя для каждого cron, как в примере:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">0 1 * * * user /home/user/user-script.sh</span></pre>

<p>
	Отладка работы cron.
</p>

<p>
	После того как вы настроили правила, еще хотелось бы проверить работают ли они. Для этого ждем того времени, когда скрипт уже должен быть выполнен и смотрим log cron. Обычно он находится в /var/log/cron.
</p>

<p>
	Если нужно проверить скрипт, который находится в одной из специализированных папок, то тут еще проще, просто запустите run-paths, передав ей в параметр нужную папку или даже сам скрипт:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">sudo run-paths /etc/cron.daily/</span></pre>

<p>
	Примерно вот так:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

37 * * * * root run-parts /etc/cron.hourly
23 5 * * * root run-parts /etc/cron.daily
19 3 * * 0 root run-parts /etc/cron.weekly
23 0 6 * * root run-parts /etc/cron.monthly</span></pre>

<p>
	<strong>Файлы справки и помощи по cron.</strong>
</p>

<p>
	Для получения дополнительной информации вы можете проверить страницу man:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">man cron</span></pre>

<p>
	, а также:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">man crontab</span></pre>

<p>
	<strong>Cron калькуляторы.</strong>
</p>

<p>
	Если трудно установить правильную задачу в начале, вы можете использовать cron калькулятор, чтобы сгенерировать выражение требуемой задачи. Можно найти несколько хороших калькуляторов cron в Интернете.
</p>

<p>
	<a href="https://www.freeformatter.com/cron-expression-generator-quartz.html" rel="external nofollow">freeformatter.com</a> — сайт с анкетой запуска заданий, заполняете анкету и получаете строку для cron.
</p>

<p>
	<a href="https://crontab.guru/" rel="external nofollow">crontab.guru</a> — сайт для генерации случайного времени исполнения задания, нажали кнопочку — получили рандомную строку для cron.
</p>

<p>
	<a href="https://sysmasters.net/kalkulyator-cron/" rel="external nofollow">sysmasters.net</a> — обратный калькулятор, вводим в поле строку из cron и получаем расшифровку, что и когда будет исполняться.
</p>

<p>
	<strong>Как можно получить «копию» crontab?</strong>
</p>

<p class="AMB_Message AMB_Message_warning" style="line-height:18px;">
	Внимание! На самом деле не рекомендуется обработать те файлы вручную!
</p>

<p>
	На crontab странице справочника есть упоминание, что:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		Цитата
	</div>

	<div class="ipsQuote_contents">
		<p>
			У каждого пользователя может быть их собственный crontab, и хотя это файлы в /var/spool/cron/crontabs, они не предназначены для непосредственного редактирования.
		</p>
	</div>
</blockquote>

<p>
	Файлы под /var/spool считаются временными/рабочими, вот почему они, вероятно, будут удалены во время обновления, хотя если более внимательно рассмотреть cron сценарии обновления пакета, то можно понять некоторые интересные детали.
</p>

<p>
	Так или иначе это, всегда хорошо, создать резервную копию записей крона или сохранить их в файле в корневом каталоге.
</p>

<p>
	Я предполагаю, что вы используете crontab -e создать crontab файлы на лету. Если так, можно получить «копию» crontab файла путем выполнения crontab -l.
</p>

<p>
	Выводим информацию в файл для получения эффекта «резервного копирования»:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">crontab -l &gt; my-crontab</span></pre>

<p>
	Затем можно отредактировать это мой-crontab файл, чтобы добавить или изменить записи и затем «установить» его путем предоставления его crontab:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">crontab my-crontab</span></pre>

<p>
	Это делает тот же эффект, как проверяющая команда crontab -e.
</p>

<p>
	<strong>Житейские примеры из практики.</strong>
</p>

<p>
	Вариант записи в crontab:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln"># как обычно, с символа '#' начинаются комментарии
# в качестве командного интерпретатора использовать /bin/sh
SHELL=/bin/sh
# результаты работы можно отправлять по этому адресу
MAILTO=paul@example.org
# добавить в PATH домашний каталог пользователя
PATH=/bin:/usr/bin:/home/paul/bin

#### Здесь начинаются задания
# выполнять каждый день в 0 часов 5 минут, результат складывать в log/daily
5 0 * * * $HOME/bin/daily.job &gt;&gt; $HOME/log/daily 2&gt;&amp;1
# выполнять 1 числа каждого месяца в 14 часов 15 минут
15 14 1 * * $HOME/bin/monthly
# каждый рабочий день в 22:00
0 22 * * 1-5 echo "Пора домой" | mail -s "Уже 22:00" john

23 */2 * * * echo "Выполняется в 0:23, 2:23, 4:23 и т. д."
5 4 * * sun echo "Выполняется в 4:05 в воскресенье"
0 0 1 1 * echo "С новым годом!"
15 10,13 * * 1,4 echo "Эта надпись выводится в понедельник и четверг в 10:15 и 13:15"
0-59 * * * * echo "Выполняется ежеминутно"
0-59/2 * * * * echo "Выполняется по чётным минутам"
1-59/2 * * * * echo "Выполняется по нечётным минутам"
# каждые 5 минут
*/5 * * * * echo "Прошло пять минут"
# каждое первое воскресенье каждого месяца. -eq 7 это код дня недели, т. е. 1 -&gt; понедельник , 2 -&gt; вторник и т. д.
0 1 1-7 * * [ "$(date '+\%u')" -eq 7 ] &amp;&amp; echo "Эта надпись выводится каждое первое воскресенье каждого месяца в 1:00"

# Cert Renewal
30 6 1 * * root /usr/local/bin/certbot-auto renew --post-hook "nginx -s reload" &gt;&gt; /var/log/le-renew.log

# Site hamsterden.ru day rotate
10 4 * * * root /usr/bin/bash /sh/hamsterden.ru-backup-day.sh &gt; /dev/null 2&gt;&amp;1

# Clean Trash Yandex.Disk
0 5 * * * root /usr/bin/bash /sh/mycleantrash.sh &gt; /dev/null 2&gt;&amp;1

# для принудительного "сброса" содержимого временных буферов памяти на диск
0,30 * * * * date; sync; echo "запись данных на диск"

# прочие примеры
/5 * * * * /misc/git_ansible_update.sh &gt; /misc/last_update.log 2&gt;&amp;1
11 * * * * /usr/bin/find /etc/ansible -name "*.retry" -type f -delete 2&gt;&amp;1
*/5 * * * * cd ~/.ssh &amp;&amp; eval `ssh-agent -s` &amp;&amp; $(cat /home/username/.ssh/someway | ssh-add -) &amp;&amp; git pull &amp;&gt; ~/last_udpate.log
*/5 * * * * cd ~/.ssh/config.d/ &amp;&amp; git pull &amp;&gt; ~/last_udpate.log

# запустить скрипт после перезагрузки сервера, через 600 секунд
@reboot sleep 600; find ${HOME}/my_app/check_conn.sh</span></pre>

<p>
	<strong>Оригиналы источников информации.</strong>
</p>

<p>
	<a href="https://ru.wikipedia.org/wiki/Cron" rel="external nofollow">ru.wikipedia.org</a> «cron».
</p>

<p>
	<a href="https://www.linuxshop.ru/articles/a26710788-nastroyka_cron" rel="external nofollow">linuxshop.ru</a> «Настройка cron».
</p>

<p>
	<a href="https://andreyex.ru/centos-7/avtomatizaciya-sistemnyx-zadach-s-ispolzovaniem-cron-na-centos-7/" rel="external nofollow">andreyex.ru</a> «Автоматизация системных задач с использованием cron на CentOS 7».
</p>

<p>
	<a href="http://rus-linux.net/kos.php?name=/papers/cron.html" rel="external nofollow">rus-linux.net</a> «Домашнее задание для компьютера».
</p>

<p>
	<a href="http://askubuntu.ru" rel="external nofollow">askubuntu.ru</a> «Где хранится пользовательский crontab?»
</p>

<p>
	 
</p>

<p>
	<a href="https://hamsterden.ru/cron/" rel="external nofollow">Источник</a>
</p>
]]></description><guid isPermaLink="false">24</guid><pubDate>Thu, 23 Dec 2021 17:50:18 +0000</pubDate></item><item><title>Nextcloud | Warning: PHP Opcache not properly configured</title><link>https://blog.ya-hz.ru/index.php?/articles.html/%D0%BF%D0%BE%D1%81%D1%82%D0%B8%D0%BD%D0%B3/nix/nextcloud-warning-php-opcache-not-properly-configured-r27/</link><description><![CDATA[
<p><img src="https://blog.ya-hz.ru/uploads/monthly_2022_01/1.png.61815d350b891da948b2e20824cef978.png" /></p>
<p>
	Ну нельзя обновить nectcloud так чтобы всё работало. И вот в очередной раз проблемы. По мимо индексов баз, решение которое мы уже обсуждали по ссылке ниже
</p>
<iframe allowfullscreen="" data-embedauthorid="1" data-embedcontent="" data-embedid="embed4137432318" scrolling="no" style="height:494px;max-width:502px;" data-embed-src="https://blog.ya-hz.ru/index.php?/articles.html/%D0%BF%D0%BE%D1%81%D1%82%D0%B8%D0%BD%D0%B3/nix/nextcloud-%D0%B2-%D0%B1%D0%B0%D0%B7%D0%B5-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%BE%D1%82%D1%81%D1%83%D1%82%D1%81%D1%82%D0%B2%D1%83%D1%8E%D1%82-%D0%BD%D0%B5%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B-r23/&amp;do=embed"></iframe>

<p>
	появилась новая проблема. Мол OPcache не правильно настроен. И указывает параметр который не правильно настроен
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">opcache.interned_strings_buffer</span></pre>

<p>
	этот параметр должен быть 8. 
</p>

<p>
	У меня система Centos 8 Stream, поэтому я буду приводить команды для неё.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">nano /etc/php.d/10-opcache.ini</span></pre>

<p>
	и меняем параметры на следующие значение ( если вдруг они ещё не поменяны)
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">opcache.enable=1
opcache.enable_cli=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1</span></pre>

<p>
	самое важное здесь это <strong>opcache.interned_strings_buffer=8. </strong>Сохраняем и ребутим php-fpm
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">systemctl restart php-fpm</span></pre>

<p>
	заходим в облако и видим что ошибка не исчезла. Не беда! Снова редактируем файл /etc/php.d/10-opcache.ini
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">nano /etc/php.d/10-opcache.ini</span></pre>

<p>
	и выключаем opcache
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">opcache.enable=0</span></pre>

<p>
	и увеличиваем на всякий случай параметр <strong>opcache.interned_strings_buffer до 24 </strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">opcache.interned_strings_buffer=24</span></pre>

<p>
	после чего ребутим php-fpm 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">systemctl restart php-fpm</span></pre>

<p>
	и редактируя всё тот же файл включаем opcache обратно
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">opcache.enable=1</span></pre>

<p>
	и снова ребутим php-fpm. Всё теперь ошибка должна уйти. 
</p>
]]></description><guid isPermaLink="false">27</guid><pubDate>Mon, 31 Jan 2022 17:59:23 +0000</pubDate></item><item><title>ping: sendto: No buffer space available</title><link>https://blog.ya-hz.ru/index.php?/articles.html/%D0%BF%D0%BE%D1%81%D1%82%D0%B8%D0%BD%D0%B3/nix/ping-sendto-no-buffer-space-available-r28/</link><description><![CDATA[
<p><img src="https://blog.ya-hz.ru/uploads/monthly_2022_02/komanda-ping-linux.jpg.348948d0352d96d3cf54f4e27a8515bf.jpg" /></p>
<p>
	Если вы увидели такое сообщение на сервере, значит пришло время посмотреть и оценить сетевую нагрузку на сервер. Посмотреть текущее состояние буферов можно так:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln"># netstat -m
1026/2709/3735 mbufs in use (current/cache/total)
1024/1766/2790/132096 mbuf clusters in use (current/cache/total/max)
1024/768 mbuf+clusters out of packet secondary zone in use (current/cache)
0/802/802/66048 4k (page size) jumbo clusters in use (current/cache/total/max)
0/0/0/33024 9k jumbo clusters in use (current/cache/total/max)
0/0/0/16512 16k jumbo clusters in use (current/cache/total/max)
2304K/7417K/9721K bytes allocated to network (current/cache/total)
0/0/0 requests for mbufs denied (mbufs/clusters/mbuf+clusters)
0/0/0 requests for jumbo clusters denied (4k/9k/16k)
0/0/0 sfbufs in use (current/peak/max)
0 requests for sfbufs denied
0 requests for sfbufs delayed
15 requests for I/O initiated by sendfile
0 calls to protocol drain routines</span></pre>

<p>
	или
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln"># vmstat -z | grep mbuf
mbuf_packet: 256, 0, 1024, 768, 9163111497, 0
mbuf: 256, 0, 2, 1941, 6166886673, 0
mbuf_cluster: 2048, 132096, 1792, 998, 14208, 0
mbuf_jumbo_page: 4096, 66048, 0, 802, 166262704, 0
mbuf_jumbo_9k: 9216, 33024, 0, 0, 0, 0
mbuf_jumbo_16k: 16384, 16512, 0, 0, 0, 0
mbuf_ext_refcnt: 4, 0, 0, 672, 11055, 0</span></pre>

<p>
	Так же можно ещё посмотреть количество коллизий на интерфейсах:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln"># netstat -id</span></pre>

<p>
	Если кратко объяснить, что оно такое: нехватка системных буферов для выполнения операций. Как правило такая проблема появляться на плохих сетевых карточках и не всегда зависит от большой нагрузки. К примеру, я наблюдал такую ситуацию, когда в кроне выставлен пинг (8 пакетов) на хост каждый 5 минут и за сутки появлялось такое сообщение на шлюзе, который обслуживает 20 человек с каналом загрузки до 10мбит.
</p>

<p>
	Но что же сделать, что бы избавиться от этого раз и навсегда? Самый правильный способ — поставить хорошие сетевые карточки, например, Intel (igb). Второй вариант даёт результат с вероятностью 50%. Он представляет собой небольшой тюниг переменных системы и ядра. Опишу его ниже.
</p>

<p>
	— увеличиваем количество nmbclusters и буферов:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">echo 'kern.ipc.nmbclusters=524288' &gt;&gt; /boot/loader.conf
echo 'kern.ipc.maxsockbuf=1048576' &gt;&gt; /boot/loader.conf
echo 'hw.igb.rxd=4096' &gt;&gt; /boot/loader.conf
echo 'hw.igb.txd=4096' &gt;&gt; /boot/loader.conf</span></pre>

<p>
	где igb — имя сетевой карты, на которой возникают проблемы (если у вас другая — замените соответственно на другое имя)
</p>

<p>
	Примечание.
</p>

<p>
	На 64-битных системах с большим объёмом памяти можно выставить значения kern.ipc.nmbclusters=1000000
</p>

<p>
	— увеличиваем размер буфера
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">net.inet.tcp.sendbuf_max=16777216
net.inet.tcp.recvbuf_max=16777216
net.inet.tcp.sendbuf_inc=16384
net.inet.tcp.recvbuf_inc=524288</span></pre>

<p>
	— увеличиваем количество пользователей и значение буферов
</p>

<p>
	пересобираем ядро с такими параметрами<br />
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">maxusers        512
options         NBUF=4096</span></pre>

<p>
	Если вы используете netgraph, можно ещё увеличить такие значения:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">net.graph.maxdgram=524288
net.graph.recvspace=524288</span></pre>

<p>
	Если же после этого тюнинга продолжают появляться такие ошибки — попробуйте либо увеличить значения либо поставить всё же нормальную сетевую карточку.
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">28</guid><pubDate>Mon, 07 Feb 2022 15:35:50 +0000</pubDate></item><item><title>Nextcloud | &#x41F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x44B; &#x441; Nextcloud Office</title><link>https://blog.ya-hz.ru/index.php?/articles.html/%D0%BF%D0%BE%D1%81%D1%82%D0%B8%D0%BD%D0%B3/nix/nextcloud-%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B-%D1%81-nextcloud-office-r29/</link><description><![CDATA[
<p><img src="https://blog.ya-hz.ru/uploads/monthly_2022_03/Nextcloud-Hub-background.png.5d252e151fa45fb89971239764bd0188.png" /></p>
<p>
	После очередного обновления, очередная проблема. В общем перестали открываться офисные документы непосредственно в веб версии облака. Лечится просто, нужно добавить параметр allow_local_remote_servers. для этого выполняем следующую команду <br />
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">sudo -u apache php occ config:system:set allow_local_remote_servers --value true --type bool</span></pre>

<p>
	Вот другие статьи на тему ошибок nextcloud
</p>

<p>
	<a href="https://blog.ya-hz.ru/index.php?/forums/topic/24-nextcloud-%D0%B2-%D0%B1%D0%B0%D0%B7%D0%B5-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%BE%D1%82%D1%81%D1%83%D1%82%D1%81%D1%82%D0%B2%D1%83%D1%8E%D1%82-%D0%BD%D0%B5%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B/&amp;do=findComment&amp;comment=29" rel="">В базе данных отсутствуют некоторые индексы</a>
</p>

<p>
	<a href="https://blog.ya-hz.ru/index.php?/forums/topic/17-%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BE%D0%BA-http-%C2%ABstrict-transport-security%C2%BB/&amp;do=findComment&amp;comment=21" rel="">Заголовок HTTP «Strict-Transport-Security»</a>
</p>

<p>
	<a href="https://blog.ya-hz.ru/index.php?/articles.html/%D0%BF%D0%BE%D1%81%D1%82%D0%B8%D0%BD%D0%B3/nix/nextcloud-warning-php-opcache-not-properly-configured-r27/" rel="">Warning: PHP Opcache not properly configured</a>
</p>
]]></description><guid isPermaLink="false">29</guid><pubDate>Wed, 23 Mar 2022 17:12:34 +0000</pubDate></item><item><title>&#x41A;&#x43E;&#x43D;&#x447;&#x438;&#x43B;&#x43E;&#x441;&#x44C; &#x43C;&#x435;&#x441;&#x442;&#x43E; &#x43D;&#x430; &#x434;&#x438;&#x441;&#x43A;&#x435; &#x432; centos 7</title><link>https://blog.ya-hz.ru/index.php?/articles.html/%D0%BF%D0%BE%D1%81%D1%82%D0%B8%D0%BD%D0%B3/nix/%D0%BA%D0%BE%D0%BD%D1%87%D0%B8%D0%BB%D0%BE%D1%81%D1%8C-%D0%BC%D0%B5%D1%81%D1%82%D0%BE-%D0%BD%D0%B0-%D0%B4%D0%B8%D1%81%D0%BA%D0%B5-%D0%B2-centos-7-r37/</link><description><![CDATA[
<p><img src="https://blog.ya-hz.ru/uploads/monthly_2022_09/123asd.jpg.29a2d33a157fa3b8fd1d49acdb67e134.jpg" /></p>
<p>
	Давеча столкнулся с проблемой. Кончилось место на диске. Причем в корне. Скринов не наделал, т.к. нужно было решать проблему быстро. В общем что же произошло
</p>

<p>
	Получил сообщение о том что сайт не работает. Первым дело проверяю виртуалку - с ней всё впорядке. Начинаю тыкать сервисы - тоже. Но при открытии сайта - вылазит ошибка. Пытаюсь прочитать логи - в логах ничего. Странно. Ну и решил глянуть на место, может logrotate сломался. Как оказалось место кончилось. Ну я полез в логи и поудалял. На самом деле логов было не много, значит logrotate работал исправно. В чем же дело. Запускаю ncdu и смотрю по папкам. Папка /var весит 500 гигов. Но это нормально, ведь в ней есть папка /var/mnt/bck - которая прицеплена по NFS, и она как раз почти столько и вешает. В общем ковырялся смотрел, и решил отцепить NFS, на всякий случай. Заодно почистить бекапы если потребуется. И что вы думаете? Отцепив NFS - папка /var всё равно весила много и как раз занимала всё место. Посмотрев что же в ней занимаете место я удивился: т.к. при отцепленой шаре NFS папка всё равно присутствовала. И тогда до меня дошло: <br />
	Как то раз у меня накрылся FreeNAS. Встал колом. Я его ребутнул. Вот видимо тогда и папка отвалилась, но продолжила делать бекапы в указанную папку. После ребута, NFS шара подцепилась заного, но файлы то остались. В итоге современем логи добили оставшееся место - и вуаля. Место в корне кончилось. Так что будьте внимательны при NFS шарах <img src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f642.png" class="ipsEmoji" alt="🙂"> 
</p>
]]></description><guid isPermaLink="false">37</guid><pubDate>Sat, 17 Sep 2022 16:04:10 +0000</pubDate></item><item><title>Nextcloud | &#x41D;&#x435;&#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x444;&#x43E;&#x440;&#x43C;&#x430;&#x442; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438; &#x43E;&#x431;&#x43D;&#x430;&#x440;&#x443;&#x436;&#x435;&#x43D; &#x432; &#x432;&#x430;&#x448;&#x435;&#x439; &#x431;&#x430;&#x437;&#x435; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;.</title><link>https://blog.ya-hz.ru/index.php?/articles.html/%D0%BF%D0%BE%D1%81%D1%82%D0%B8%D0%BD%D0%B3/nix/nextcloud-%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8-%D0%BE%D0%B1%D0%BD%D0%B0%D1%80%D1%83%D0%B6%D0%B5%D0%BD-%D0%B2-%D0%B2%D0%B0%D1%88%D0%B5%D0%B9-%D0%B1%D0%B0%D0%B7%D0%B5-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-r49/</link><description><![CDATA[
<p><img src="https://blog.ya-hz.ru/uploads/monthly_2025_03/81e9fffd81fb3d338ed90ae129cce972108ddcb4_2_1380x776.jpeg.34bbdd78c7872535e2977a1d34bb19d8.jpeg" /></p>
<p>
	Давеча после обновления nextcloud до версии 31.0.0 в админке столкнулся вновь с кучей ошибок. То что там проблемы с индексами после обновления - это уже стандартная тема, а вот ошибка из сабжа - что-то новенькое. И так как же её решить. А очень и очень просто. 
</p>

<p>
	Цепляемся к своему серверу по ссх. заходим в мускуль командой
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">mysql -u root -p</span></pre>

<p>
	прописываем 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">SET GLOBAL innodb_default_row_format=DYNAMIC;</span></pre>

<p>
	после чего прописываем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">SELECT CONCAT('ALTER TABLE `', table_name, '` ROW_FORMAT=DYNAMIC;') AS sql_statements
FROM information_schema.tables
WHERE table_schema = 'nextcloud'
AND ROW_FORMAT != 'Dynamic';</span></pre>

<p class="AMB_Message AMB_Message_tip" style="line-height:18px;">
	Обратите внимание на то как называется схема, у меня это nextcloud
</p>

<p>
	Он выдаст портянку текста. Её нужно скопировать и выполнить как sql скрипт. Портянка примерно такого содержания
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">| ALTER TABLE `oc_ex_task_processing` ROW_FORMAT=DYNAMIC;        |
| ALTER TABLE `oc_collres_resources` ROW_FORMAT=DYNAMIC;         |
| ALTER TABLE `oc_user_status` ROW_FORMAT=DYNAMIC;               |
| ALTER TABLE `oc_flow_checks` ROW_FORMAT=DYNAMIC;               |
| ALTER TABLE `oc_privacy_admins` ROW_FORMAT=DYNAMIC;            |
| ALTER TABLE `oc_cards` ROW_FORMAT=DYNAMIC;                     |</span></pre>

<p>
	Что я сделал. Скопировал это всё, вставил в текстовый документ. удалил лишние символы |, зашел в PMA. Выбрал нужную схему и просто выполнил его в SQL
</p>

<p>
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="107" data-ratio="43.47" width="881" alt="image.png.853f3d8b16ebd41f1a45854f80612611.png" data-src="https://blog.ya-hz.ru/uploads/monthly_2025_03/image.png.853f3d8b16ebd41f1a45854f80612611.png" src="https://blog.ya-hz.ru/applications/core/interface/js/spacer.png" />
</p>

<p>
	И вуаля. Ошибка пропала <img src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f642.png" class="ipsEmoji" alt="🙂"> За подсказку спасибо передавать <a href="https://techoverflow.net/2025/03/12/how-to-convert-nextcloud-mariadb-mysql-tables-to-row-format-dynamic/" rel="external nofollow">вот сюда</a>
</p>
]]></description><guid isPermaLink="false">49</guid><pubDate>Thu, 13 Mar 2025 15:01:17 +0000</pubDate></item><item><title>&#x423;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x430; &#x43C;&#x435;&#x43D;&#x435;&#x434;&#x436;&#x435;&#x440;&#x430; &#x43F;&#x430;&#x440;&#x43E;&#x43B;&#x435;&#x439; BearPass</title><link>https://blog.ya-hz.ru/index.php?/articles.html/%D0%BF%D0%BE%D1%81%D1%82%D0%B8%D0%BD%D0%B3/nix/%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%BC%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80%D0%B0-%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D0%B5%D0%B9-bearpass-r50/</link><description><![CDATA[
<p><img src="https://blog.ya-hz.ru/uploads/monthly_2025_06/BearPass.jpg.1a82c442aef71bbf297fff58d008d3ff.jpg" /></p>
<p>
	На новой работе встал вопрос поднялся вопрос о том что все пароли хранятся у нашей команды у кого как. У кого в текстовых документах, у кого на облаке OneDrive в таблице, у кого вообще во всех местах подряд. Я же для своих паролей использую KeePassXC. Файл базы лежит на моём облаке Nextcloud и на телефоне установлено приложение KeePass for Android. Но когда встал а где мне взять пароль от чего-то - мне сообщили пароль у Васи. А Вася в отпуске и трубку не берёт. Вот собственно тогда и встал вопрос о том чтобы рабочие пароли как-то хранить централизованно, что бы у каждого из сотрудников был доступ и можно было в любой момент найти нужный пароль в независимости от того от чего он и кто за него отвечает. <br />
	Выбор того как хранить пароли, на самом деле достаточно велик: форков тогоже KeePass достаточно много. Посути KeePassXC сам является форком KeePass Save, если мне не изменяет память. Но у меня стояли конкретные цели: <br />
	1. Удобство хранения<br />
	2. Запуск на любом устройстве<br />
	3. Мобильная версия<br />
	4. Шифрование<br />
	5. Генератор паролей<br />
	6. Проверка на то что пароль слит<br />
	7. Бесплатен<br />
	Были ещё требования, но они не критичны, и каждый из команды был готов от них отказаться, если приложение его устроит по параметрам указанным выше. Собственно выбор пал на два решения: Passbolt и BearPass. Толи из-за того что второй вариант был созвучен с beerpass, толи из-за того что это российская разработка, выбрали первым для тестирования его. Вот в этой статье я и расскажу как его установить. На самом деле ничего сложного в этом нет, и все делается просто. <br />
	 
</p>

<p>
	Для установки "коробочного" решения на сервер Вам потребуется:
</p>

<p>
	1. PHP 8.4<br />
	2. PostgreSQL 13 и выше<br />
	3.Пакетный менеджер Composer
</p>

<p>
	Всё. Ну и конечно 2 ядра 2 гига на борту (рекомендуют 4 но нам хватает и 2)
</p>

<p>
	Предположим что у нас уже есть установленная Debian 12 и настроенная на удаленный доступ по SSH под root пользователем. Как это сделать я думаю найти не составит труда. А скачать саму ОС можно у меня в файлах
</p>
<iframe allowfullscreen="" data-embedauthorid="1" data-embedcontent="" data-embedid="embed7747690279" style="height:527px;max-width:502px;" data-embed-src="https://blog.ya-hz.ru/index.php?/files/file/3-debian-12110-amd64-netinstiso/&amp;do=embed"></iframe>

<p>
	Первым делом конечно же обновляем систему<br />
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">apt-get update &amp;&amp; apt-get -y upgrade</span></pre>

<p>
	после чего перегружаемся 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">reboot</span></pre>

<p>
	далее добавляем пользователя из под которого будет всё работать, и в процессе из под него же мы будем всё настраивать, например www-data
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">mkdir -p /var/www
adduser --home /var/www/ www-data
cp /etc/skel/.bashrc /var/www
cp /etc/skel/.profile /var/www
chown -R www-data:www-data /var/www
usermod -s /bin/bash www-data</span></pre>

<p>
	Далее ставим мной ненавистный Git. Не люблю я его хоть это и прекрасная вещь
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">apt install git</span></pre>

<p>
	Чтобы протестировать что всё установилось, т.к. git бывает что не работает, по крайней мере у меня, проверим его версию
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">git --version</span></pre>

<p>
	Примерно должны получить следующее: 
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		Цитата
	</div>

	<div class="ipsQuote_contents">
		<p>
			git version 2.39.5
		</p>
	</div>
</blockquote>

<p>
	Далее установим php. Для этого подключим репозиторий
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">apt install apt-transport-https lsb-release ca-certificates wget -y
wget -O /etc/apt/trusted.gpg.d/php.gpg https://mirror.yandex.ru/mirrors/packages.sury.org/php/apt.gpg
sh -c 'echo "deb https://mirror.yandex.ru/mirrors/packages.sury.org/php/ $(lsb_release -sc) main" &gt; /etc/apt/sources.list.d/php.list'
apt update</span></pre>

<p>
	Ставим OpenSSL
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">apt-get install openssl</span></pre>

<p>
	Ставим php версии 8.4. 
</p>

<p class="AMB_Message AMB_Message_information" style="line-height:18px;">
	Вот тут у меня кстати была ошибка. Толи РКН вновь дурковал, толи яндекс. Но в общем у меня не хотелось ничего ставиться. Мне пришлось прописывать ключ "-y" вконце и повторять установку несколько раз, по итогу всё удалось
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">apt install php8.4 php8.4-{cli,curl,fpm,intl,mbstring,pgsql,zip,xml,bcmath,ldap}</span></pre>

<p>
	Установится всё что требуется для минимальной работы bearpass. Если необходимы будут какие-то тюненги, тут уже ставьте дополнительные модули сами. Мне достаточно было стандартной установки
</p>

<p>
	Дальше необходимо отредачить файлы конфигов, рекомендую редактировать оба: <strong>/etc/php/8.4/fpm/php.ini</strong> и <strong>/etc/php/8.4/cli/php.ini</strong><br />
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">date.timezone = "Europe/Moscow" ; Или любая другая, необходимая для сервера
include_path = "."
error_reporting = E_ALL &amp; ~E_DEPRECATED &amp; ~E_STRICT
display_errors = Off</span></pre>

<p>
	Если используем nano для редактирования, то просто ищем через "Ctrl + W", если какой-другой - то уже сами. Вообще, если я правильно помню, все параметры закомментированы, и достаточно просто в конец файлов добавить эти строки.
</p>

<p>
	Далее на необходимо в файле <strong>/etc/php/8.4/fpm/pool.d/www.conf</strong> проверить, что php-fpm запускается от ранее созданного пользователя (в нашем примере www-data)
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">user = www-data
group = www-data

listen.owner = www-data
listen.group = www-data</span></pre>

<p>
	После чего рестартим php-fpm
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">service php8.4-fpm restart</span></pre>

<p>
	После устанавливаем composer. Его я тоже не люблю еще со времен roundcube, но не смотря на всё он удобен. 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">apt install wget
wget -O composer-setup.php https://getcomposer.org/installer
php composer-setup.php --install-dir=/usr/local/bin --filename=composer
chmod +x /usr/local/bin/composer</span></pre>

<p>
	Теперь собственно переходим к установке nginx
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">apt-get install nginx nginx-full</span></pre>

<p>
	И сразу после установки удаляем его дефолтные конфиги
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">rm /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default</span></pre>

<p>
	Далее в файле <strong>/etc/nginx/nginx.conf</strong> в секции раскомментировать) строку
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">server_tokens off;</span></pre>

<p>
	Далее в файл <strong>/etc/nginx/sites-available/bearpass</strong> поместить содержимое
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">upstream bp_fastcgi_backend {
  server unix:/run/php/php8.4-fpm.sock;
}

server {
  listen 80;
  
  server_name bearpass.ru;
  
  set $BP_ROOT /var/www/bearpass;
  
  include /var/www/bearpass/nginx.conf;
}</span></pre>

<p>
	этого достаточно для работы. Изменить обязательно стоит только <strong>server_name. </strong>Остальное по желанию
</p>

<p>
	Активируем сайт
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">ln -s /etc/nginx/sites-available/bearpass /etc/nginx/sites-enabled/bearpass</span></pre>

<p>
	Далее ставим PostgreSQL
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">apt-get install postgresql</span></pre>

<p>
	и сразу же заходим под админом: по умолчанию это <strong>postgres</strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">su postgres</span></pre>

<p>
	после чего подключаемся к нему 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">psql</span></pre>

<p>
	и создаем пользователя с базой данных
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">CREATE USER </span><span class="tag">&lt;username&gt;</span><span class="pln"> WITH encrypted password '</span><span class="tag">&lt;password&gt;</span><span class="pln">';
CREATE DATABASE </span><span class="tag">&lt;db_name&gt;</span><span class="pln"> OWNER </span><span class="tag">&lt;username&gt;</span><span class="pln"> ENCODING 'UNICODE';</span></pre>

<p class="AMB_Message AMB_Message_information" style="line-height:18px;">
	Прошу обратить внимание что имя пользователя, как и имя базы идёт без одинарных ковычек, а вот пароль с одинарными ковычками
</p>

<p>
	Далее можно установить Exim4, но для его нормальной работы потребуется DKIM и SPF. А это уже больше по настройке почтового сервера, поэтому в рамках этой статьи мы это не будет рассматривать. <br />
	В целом мы с окружением закончили. Этого достаточно для минимальной работы bearpass (так и подмывает его называть beerpass). Теперь перейдём непосредственно к установке самого приложения.
</p>

<p>
	Дальше настройка и установка будет производиться из под пользователя которого мы создали ранее а именно www-data
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">su www-data</span></pre>

<p>
	далее клонируем репу с git с парольным менеджером
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">git clone https://git.bearpass.ru/bear-pass /var/www/bearpass</span></pre>

<p>
	переходим в директорию 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">cd /var/www/bearpass</span></pre>

<p>
	копируем переменные окружения
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">cp .env.example .env</span></pre>

<p>
	редактируем .env
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">nano .env</span></pre>

<p>
	заполняем следующие параметры
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">APP_URL - URL по которому будет открываться парольный менеджер
DB_DATABASE - название базы данных
DB_USERNAME - пользователь с доступом к базе данных
DB_PASSWORD - пароль пользователя</span></pre>

<p>
	устанавливаем необходимые пакеты с помощью composer
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">composer install --no-dev -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
composer dump-autoload</span></pre>

<p>
	генерируем ключи
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">php artisan key:generate
php artisan encryption-key:generate</span></pre>

<p>
	выполняем миграции
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">php artisan migrate --seed --no-interaction --force &amp;&amp;
php artisan optimize:clear</span></pre>

<p>
	теперь нам нужно добавить записи в crontab, но так как мы сейчас находимся под пользователем www-data, нам это не удастся сделать, поэтому заходим под root
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">su root</span></pre>

<p>
	редактируем crontab
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">nano /etc/crontab</span></pre>

<p>
	добавив в него строчку
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">* * * * * /usr/bin/php8.4 /var/www/bearpass/artisan schedule:run &gt; /dev/null 2&gt;&amp;1</span></pre>

<p>
	теперь вновь возвращаемся под пользователя www-data
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">su www-data</span></pre>

<p>
	и создаем пользователя с админскими правами
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">php artisan make:username</span></pre>

<p>
	В ответ должен придти запрос на ввод почты и пароля. Они требуются для авторизации
</p>

<p>
	Дальше требуется настроить SSL сертификат, но мне для тестов он не нужен, поэтому я пропустил данный параметр. А вообще он так же необходим для нормальной работы менеджера. Почитать про установку и настройку SSL сертификата можно на <a href="https://docs.bearpass.ru/guide/ssl.html" rel="external nofollow">сайте разработчиков</a>.
</p>

<p>
	На этом собственно всё. Далее заходим под root
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">su root</span></pre>

<p>
	на всякий случай рестартим nginx
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">service nginx restart</span></pre>

<p>
	и можем пользоваться. <br />
	Да, для полноценной работы необходимо настроить и почту, и SSL и желательно бы прикупить лицензию, но для тестов этого вполне достаточно. Посмотреть, прикинуть, пощупать. И если приглянулось, то можно накатывать SSL и уже тогда можно полноценно пользоваться. <br />
	В общем как-то так. 
</p>
]]></description><guid isPermaLink="false">50</guid><pubDate>Wed, 25 Jun 2025 17:19:08 +0000</pubDate></item><item><title>Rocky | &#x41E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; Rocky Linux 8 &#x434;&#x43E; 9 &#x432;&#x435;&#x440;&#x441;&#x438;&#x438;</title><link>https://blog.ya-hz.ru/index.php?/articles.html/%D0%BF%D0%BE%D1%81%D1%82%D0%B8%D0%BD%D0%B3/nix/rocky-%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-rocky-linux-8-%D0%B4%D0%BE-9-%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8-r55/</link><description><![CDATA[
<p><img src="https://blog.ya-hz.ru/uploads/monthly_2025_11/how-to-upgrade-rocky-linux-8-to-9.png.7c1a0392fd940d00c0060b3f78f394e0.png" /></p>
<p>
	Всем доброго суток. У меня крутится веб сервер для личных нужд (в частности на нём этот блог, облако, еще пара сайтов). Он довольно многострадальный, т.к. ему уже лет 7-8. Я его не раз перетаскивал с винта на винт, ну и соответственно т.к. время идет - то и версию я ему обновлял. Изначально там был Centos 7. После я его обновил до Centos 8. Далее был Centos Stream. После того как мне надоело что у меня мускуль по непонятным причинам после перезагрузки запускается через раз - решил мигрировать на Rocky, что я успешно и сделал. И вот теперь пришло время обновить до 9 версии, а точнее до 9.6. Летом вышла 10 версия, но я пока не готов шагнуть на неё. <br />
	В обновлении ничего сложного нет, по крайней мере когда у тебя установлен только LAMP. Проблем с зависимостями у меня небыло. <br />
	Единственная сложность была в инструкциях. DeepSeek упорно пытался меня заставить обновиться через leapp-data-rocky или leapp-data-flow, но как оказалось это неверное решение. Оно может быть и работало, но когда то давно. Поэтому порыскав по инету, нашел одну инструкцию и не много поковырявшись адаптировать её под актулальные версии на данный момент (а именно 9.6). И так, приступим: <br />
	Естественно первое что следует сделать - это бекап. Делайте так как вам удобно, хоть через DD. Т.к. у меня на виртуалке - я просто сделал snapshot. 
</p>

<p>
	Теперь обновляем репозитории и собственно пакеты установленные в системе: <br />
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">sudo dnf upgrade --refresh</span></pre>

<p>
	 
</p>

<p>
	После этого нам необходимо добавить репозитории актуальной версии rocky. Посмотреть это можно на <a href="https://download.rockylinux.org/pub/rocky/9/BaseOS/x86_64/os/Packages/r/" rel="external nofollow">офф репе rocky</a>. Нам необходимы версии вот этих файлов: rocky-release, rocky-repos, and rocky-gpg-keys. Копируя имена файлов, сделаем несколько переменных (на 04.11.2025 актуальная версия 9.6):
</p>

<p>
	 Ссылка на официальный репозиторий, тут как бы ничего не меняется
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">REPO_URL="https://download.rockylinux.org/pub/rocky/9/BaseOS/x86_64/os/Packages/r"</span></pre>

<p>
	А вот дальше будьте внимательны и добавляйте именая файлов для актуальной версии. На момент написания это 9.6
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">RELEASE_PKG="rocky-release-9.6-1.3.el9.noarch.rpm"
REPOS_PKG="rocky-repos-9.6-1.3.el9.noarch.rpm"
GPG_KEYS_PKG="rocky-gpg-keys-9.6-1.3.el9.noarch.rpm"</span></pre>

<p>
	После этого запускаем нехитрую команду для установки
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">sudo dnf install $REPO_URL/$RELEASE_PKG $REPO_URL/$REPOS_PKG $REPO_URL/$GPG_KEYS_PKG</span></pre>

<p>
	У меня устанавливалось/обновлялось 961 элементов. Но всё прошло достаточно быстро. После того как установка закончена, необходимо удалить то что уже не понадобится
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">dnf -y remove rpmconf yum-utils epel-release
rm -rf /usr/share/redhat-logos</span></pre>

<p>
	доставляем необходимые зависимости
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">sudo dnf -y --releasever=9 --allowerasing --setopt=deltarpm=false distro-sync</span></pre>

<p>
	ребилдим базу
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">sudo rpm --rebuilddb</span></pre>

<p>
	после чего перезагружаемся
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">reboot</span></pre>

<p>
	и радуемся новой установленной версии rocky linux
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">cat /etc/os-release</span></pre>

<p>
	Вот и всё. <br />
	 
</p>
]]></description><guid isPermaLink="false">55</guid><pubDate>Tue, 04 Nov 2025 16:25:31 +0000</pubDate></item></channel></rss>
