Если инфорация оказалась интересна и/или полезна, не побрезгуйте, оставьте комментарий ;)
Показаны сообщения с ярлыком руководства. Показать все сообщения
Показаны сообщения с ярлыком руководства. Показать все сообщения

воскресенье, 26 июня 2022 г.

YouTube Vanced больше нет. Но есть ReVanced

Статья навеяна этой новостью на Хабре

Печальные новости о проекте YouTube Vanced. Гугл потребовал закрытия проекта и удаления готовых дистрибутивов. Разработчики подчинились. Поэтому больше YouTube Vanced с официального сайта не скачать. Возможно есть где-нибудь на зеркалах, но надо быть осторожным. В дистрибутиве могут быть вредные присадки.

Напомню, чем был хорош YouTube Vanced (здесь писал, как его установить):

  1. Проигрывание видео в фоне, в том числе с погашенным экраном
  2. Проигрывание видео "картинка в картинке" на фоне другого приложения
  3. Отстутсвие рекламы от Ютуба
  4. Отстутсвие рекламных интеграций от авторов роликов (SponsorBlock)
  5. Подмена кодеков
  6. Расширенная настройка видеопараметров и много чего по мелочи

Но дело освобождения от рекламы живет и побеждает... ну почти. Теперь есть проект ReVanced. Позволяет самостоятельно пропатчить установочный файл YouTube. Для тех, кто хочет себя почувствовать кулхацкером. Надеюсь, мне блог не удалят за рассказ, как пропатчить Ютуб

Документация у них зачаточном состоянии. Но испытать проект на себе можно. Официальные требования для того, чтобы попробовать:

  • ADB. Скачать можно с официального сайта. Распакуйте содержимое архива в директорию, из которой будете работать. У меня это C:\Soft\platform-tools
  • x64 or x86 architecture for now. То есть компьютер на Интеле или АМД. Думаю, с этим проблем нет. ADB и Zulu JDK (см. ниже) есть даже под Mак
  • The apk you want to patch (e.g. YouTube v17.24.34 or YouTube Music v5.03.50). Make sure the same version of the app is installed on the device. Пакет Ютуба (apk) можно взят тут. Важно брать не последнюю версию, а ту, что рекомендуют разработчики ReVanced. Она указана на странице с требованиями. На момент написания стать это 17.24.34. Если возьмете не ту версию, будут такие ошибки:
    WARNING: Skipping seekbar-tapping: Incompatible with version 17.24.35. This patch is only compatible with version com.google.android.youtube: 17.17.34, 17.19.36, 17.20.37, 17.22.36, 17.23.35, 17.23.36, 17.24.34
  • Zulu JDK 17. Брать тут. На всякий случай, полное название "Azul Zulu Build of OpenJDK"
  • Android SDK if you plan to build the integrations from source. Это нам не пригодится
  • Добавлю от себя. У вас должен стоять microG. У меня он уже стоит, так как он используется YouTube Vanced.

Вначале я попытался пойти по этой инструкции. Но она устарела. Ключи запуска изменились. Ссылки на пакеты устарели.

У меня последовательность действий получилась следующая:

  1. Скачиваем ADB и распаковываем. Рекомендую делать короткий путь, чтобы проще было переходить в каталог из командной строки. Мой путь C:\Soft\platform-tools
  2. Скачиваем и ставим Zulu JDK. При установке надо автивировать пункт добавления путей в переменные окружения, чтобы можно было просто написать java [options]
  3. Скачиваем файлы проекта: revanced-cli, revanced-patches, revanced-integrations. И конечно apk-файл Ютуба. Я рекомендую дать скаченным файла простые названия, чтобы ими было удобно пользоваться в командной строке. apk Ютуба я назвал "youtube1.apk", apk c revanced-integrations, соответственно, "revanced-integrations.apk". Скаченные файлы копируем в директорию ADB. То есть я скопировал в C:\Soft\platform-tools.
  4. Запускаем командную строку, переходим в каталог с ADB и нашими файлами. Тут такой момент. В контекстном меню каталога есть пункт "Открыть в терминале" (Windows 11). Но такой терминал у меня рабол некорректно, он не видел запускаемого файла JAVA. Видимо, не читал переменные окружения. И файлы внутри директории видел только с префексом ".\". В общем, не надо так делать. лучше открыть терминал в меню "Пуск/Start" и выполнить команду cd:
    PS C:\Users\Evgeniy> cd C:\Soft\platform-tools\
      PS C:\Soft\platform-tools> ls
    
        Каталог: C:\Soft\platform-tools
    
    Mode                 LastWriteTime         Length Name
    ----                 -------------         ------ ----
    ------        01.01.2008      0:00        5989376 adb.exe
    ------        01.01.2008      0:00          97792 AdbWinApi.dll
    ------        01.01.2008      0:00          62976 AdbWinUsbApi.dll
    ------        01.01.2008      0:00         241664 dmtracedump.exe
    ------        01.01.2008      0:00         436224 etc1tool.exe
    ------        01.01.2008      0:00        1649152 fastboot.exe
    ------        01.01.2008      0:00          44032 hprof-conv.exe
    ------        01.01.2008      0:00         231594 libwinpthread-1.dll
    ------        01.01.2008      0:00         489984 make_f2fs.exe
    ------        01.01.2008      0:00         489984 make_f2fs_casefold.exe
    ------        01.01.2008      0:00           1157 mke2fs.conf
    ------        01.01.2008      0:00         752128 mke2fs.exe
    ------        01.01.2008      0:00        2834292 NOTICE.txt
    -a----        25.06.2022     22:22       45397186 revanced-cli-1.11.1-all.jar
    -a----        25.06.2022     22:20        1816001 revanced-integrations.apk
    -a----        25.06.2022     23:22           2040 revanced-integrations.keystore
    -a----        25.06.2022     22:10         114924 revanced-patches-1.10.5.dex
    -a----        25.06.2022     22:10         251013 revanced-patches-1.10.5.jar
    -a----        26.06.2022      0:08           2040 revanced.keystore
    ------        01.01.2008      0:00             37 source.properties
    ------        01.01.2008      0:00        1162752 sqlite3.exe
    -a----        25.06.2022     22:21      137603855 youtube.apk
    -a----        25.06.2022     23:35      137603855 youtube1.apk
    попробуйте запустить команду java. Должен быть вывод примерно такой:
    PS C:\Soft\platform-tools> java
    Usage: java [options] <mainclass> [args...]
               (to execute a class)
       or  java [options] -jar <jarfile> [args...]
               (to execute a jar file)
       or  java [options] -m <module>[/<mainclass>] [args...]
           java [options] --module <module>[/<mainclass>] [args...]
               (to execute the main class in a module)
       or  java [options] <sourcefile> [args]
               (to execute a single source-file program)
    
     Arguments following the main class, source file, -jar <jarfile>,
     -m or --module <module>/<mainclass> are passed as the arguments to
     main class.
    ..........
  5. Включаем на телефоне отладку по USB. На моем телефоне для этого надо 10 раз пошлепать по номеру сборки в "Информации о телефоне" для получения доступа к "Меню разработчика". Затем выбрать соответствющий пункт. Способ может быть свой каждой модели телефона.
  6. Нужно узнать идентификатор телефона. Для этого подключаем телефон к комптютеру по USB и вводим команду:
    PS C:\Soft\platform-tools> adb devices
    * daemon not running; starting now at tcp:5037
    * daemon started successfully
    List of devices attached
    12345678        unauthorized  
    На экране смартфона появится окно с предложением авторизовать подключение. Соглашаемся. Еще раз выполняем команду для проверки:
    PS C:\Soft\platform-tools> ./adb devices
    List of devices attached
    12345678        device
    Теперь всё хорошо. Нам нужен это идентификатор - в моем примере 12345678.
  7. Надо определиться с теми патчами, которые вы НЕ хотите накладывать. Полный список можно вывести следующей командой. Рекомендую это сделать на своем компьютере, разработчики бодро вносят изменения:
    PS C:\Soft\platform-tools> java.exe -jar .\revanced-cli-1.11.1-all.jar -b .\revanced-patches-1.10.5.jar -l
    INFO: seekbar-tapping: Enable tapping on the seekbar of the YouTube player.
    INFO: general-ads: Patch to remove general ads in bytecode.
    INFO: video-ads: Patch to remove ads in the YouTube video player.
    INFO: custom-branding: Change the branding of YouTube.
    INFO: premium-heading: Show the premium branding on the the YouTube home screen.
    INFO: minimized-playback: Enable minimized and background playback.
    INFO: disable-fullscreen-panels: Disable comments panel in fullscreen view.
    INFO: old-quality-layout: Enable the original quality flyout menu.
    INFO: disable-create-button: Disable the create button.
    INFO: amoled: Enables pure black theme.
    INFO: disable-shorts-button: Hide the shorts button.
    INFO: hide-cast-button: Patch to hide the cast button.
    INFO: microg-support: Patch to allow YouTube ReVanced to run without root and under a different package name.
    INFO: background-play: Enable playing music in the background.
    INFO: exclusive-audio-playback: Add the option to play music without video.
    INFO: codecs-unlock: Enables more audio codecs. Usually results in better audio quality but may depend on song and device.
    INFO: upgrade-button-remover: Remove the upgrade tab from the pivot bar in YouTube music.
    INFO: tasteBuilder-remover: Removes the "Tell us which artists you like" card from the Home screen. The same functionality can be triggered from the settings anyway
    Приведу список ключей, доступный на момент написания статьи. Тоже рекомендую проверить список на момент вашей работы:
    PS C:\Soft\platform-tools> java.exe -jar .\revanced-cli-1.11.1-all.jar -h
    Usage: ReVanced-CLI [-hV] (-b=<patchBundles> [-b=<patchBundles>]... [-l]
                        [-a=<inputFile> -o=<outputPath> [-e=<excludedPatches>]...
                        [-r] [--experimental] [-m=<mergeFiles>]... [--mount]
                        [--cn=<cn>] [--keystore=<keystorePath>] [-p=<password>]
                        [-d=<deploy>] [-t=<cacheDirectory>] [-c]])
      -a, --apk=<inputFile>      Input file to be patched
      -b, --bundles=<patchBundles>
                                 One or more bundles of patches
      -c, --clean                Clean the temporal resource cache directory. This
                                   will be done anyways when running the patcher
          --cn=<cn>              Overwrite the default CN for the signed file
      -d, --deploy-on=<deploy>   If specified, deploy to adb device with given name
      -e, --exclude=<excludedPatches>
                                 Explicitly exclude patches
          --experimental         Disable patch version compatibility patch
      -h, --help                 Show this help message and exit.
          --keystore=<keystorePath>
                                 File path to your keystore
      -l, --list                 List patches only
      -m, --merge=<mergeFiles>   One or more dex file containers to merge
          --mount                If specified, instead of installing, mount
      -o, --out=<outputPath>     Output file path
      -p, --password=<password>  Overwrite the default password for the signed file
      -r, --resource-patcher     Disable patching resources
      -t, --temp-dir=<cacheDirectory>
                                 Temporal resource cache directory
      -V, --version              Print version information and exit.
    Например, в статье, на которую я ссылался выше использовался ключ "-i", позволявший активировать патч. Надо было перечислить все патчи, которые нужно применить. А вот в текущей версии такого ключа нет, но есть ключ "-e", который исключает применение тех или иных патчей. То есть оказывает обратное действие в сравнении со старым ключом "-i".
  8. Проверяем, что телефон подключен к компьютеру и выполняем команду:
    PS C:\Soft\platform-tools> java.exe -jar .\revanced-cli-1.11.1-all.jar -a .\youtube1.apk -c -d 12345678 -o .\revanced.apk -b .\revanced-patches-1.10.5.jar -m .\revanced-integrations.apk
    INFO: Decoding resources
    INFO: Reading dex files
    INFO: Merging .\revanced-integrations.apk
    WARNING: Skipping background-play: Incompatible with com.google.android.youtube. This patch is only compatible with com.google.android.apps.youtube.music
    WARNING: Skipping exclusive-audio-playback: Incompatible with com.google.android.youtube. This patch is only compatible with com.google.android.apps.youtube.music
    WARNING: Skipping codecs-unlock: Incompatible with com.google.android.youtube. This patch is only compatible with com.google.android.apps.youtube.music
    WARNING: Skipping upgrade-button-remover: Incompatible with com.google.android.youtube. This patch is only compatible with com.google.android.apps.youtube.music
    WARNING: Skipping tasteBuilder-remover: Incompatible with com.google.android.youtube. This patch is only compatible with com.google.android.apps.youtube.music
    INFO: seekbar-tapping succeeded
    INFO: general-ads succeeded
    INFO: video-ads succeeded
    INFO: custom-branding succeeded
    INFO: premium-heading succeeded
    INFO: minimized-playback succeeded
    INFO: disable-fullscreen-panels succeeded
    INFO: old-quality-layout succeeded
    INFO: disable-create-button succeeded
    INFO: amoled succeeded
    INFO: disable-shorts-button succeeded
    INFO: hide-cast-button succeeded
    INFO: microg-support succeeded
    INFO: Compiling resources
    INFO: Writing modified dex files
    INFO: Writing dex file classes.dex
    INFO: Writing dex file classes3.dex
    INFO: Writing dex file classes2.dex
    INFO: Writing dex file classes4.dex
    INFO: Writing dex file classes6.dex
    INFO: Writing dex file classes5.dex
    INFO: Writing dex file classes7.dex
    INFO: Writing dex file classes8.dex
    INFO: Writing resources
    INFO: Aligning revanced_raw.apk
    INFO: Signing revanced_aligned.apk
    INFO: Found existing keystore: revanced
    INFO: Copying revanced_signed.apk to revanced.apk
    INFO: Installing without mounting
    INFO: Finished
    Пакет будет подготовлен и установлен на телефон. Важно. Имя пакета в ключе"-o .\revanced.apk" - это выходное имя создаваемого пакета. Его на момент запуска команды еще не существует. Имя можно выбрать любое. Идентификатор устройства в ключе "-d 12345678" мы узнали на шаге 6.

    Пример команды, если мы хотим исключить некоторые патчи:
    java.exe -jar .\revanced-cli-1.11.1-all.jar -a .\youtube1.apk -c -d 6535d72f -o .\revanced.apk -b .\revanced-patches-1.10.5.jar -m .\revanced-integrations.apk -e custom-branding -e premium-heading -e amoled
  9. Остается проверить, что прижение появилось на телефоне и работает.

Из замеченных минусов - нет тонкой настройки видео, как было в YouTube Vanced. И нет фильтра на ремкламную интеграцию авторов видео. И явный минус - всю эту операцию надо делать регулярно с выходом новых версий Ютуба и патчей ReVanced к нему

среда, 22 июня 2022 г.

Настройка клиента для ownCloud. FolderSync

Первая часть руководства по созданию службы резервного копирования с телефона на базе ownCloud была тут. Рассмотрена установка и настройка серверной части. Во второй части быстро рассмотрим, как настроить клиента для полноты картины

Для резервного копирования я предлагаю использовать приложение FolderSync. Уверен есть альтернативы, платные и бесплатные. Но эта программа мои задачи решила

Запускаем его. Первым делом надо добавить нашу учетную запить на ownCloud

Выбираем ближайшую версию ownCloud. В предыдущей части ставилась десятая версия. Но такого варианта тут нет, поэтому выбираем ownCloud 9

Вводим название учетной записи (1). Я выбрал Backup. Можно взять название сервера, или просто Home Dropbox, в нем же не только резервные копии хранить можно. Кроме имени надо заполнить имя и пароль пользователя (2,3). Это может быть пользователь из параметра --admin-user "admin", созданный на шаге 12 первой части. Либо специально созданный пользователь, если решение используют несколько человек.
Заполняем IP-адрес или FQDN (если в сети поднят DNS-сервер) (4), адрес порта HTTPS 443 (5), директория (по умолчанию owncloud) (6) и разрешение использовать самоподписанный сертификат (мы его сделали на шаге 8) (7). Когда все поля заполнены, нажимает "Тест".

Если всё хорошо, нажимает "Сохранить" (9). Если что-то пошло не так, ищем, где ошибка и повторяем тест.

Следующий шаг - создать задания. Это исходный каталог на устройстве и целевой каталог в ownCloud и регламент синхронизации. На начальном экране программы выбираем "Задания" (1). Далее нашу учетную запить (2).

Выбираем создать новую папку в ownCloud, даем ей говорящее название.

Заходим в нее

И подстверждаем выбор

Выбираем исходный каталог на устройстве (1), файлы из которого мы будем синхронизировать, и подтверждаем выбор (2)

Теперь настраиваем регламент. Вкладка "Основные". выбираем вариант "На удаленную папку", то есть с устройства на ownCloud

На вкладке "Планирование" выбираем работу по расписанию, регулярность копирования (ежедневно) и время синхронизации - лучше выбрать ночное время, когда телефон простаивает и стоит на зарядке

Вкладка "Настройка синхронизации". Выбираем синхронизацию вложенных папок и скрытых файлов (не всегда нужно). Старые файлы заменяются новыми без дополнительных вопросов

Вкладка "Продвинутые". Выбираем "Повторять при ошибке".

Вкладка "Соединение". Выбираем синхронизацию при подключении к Wi-Fi. проводное подключение на телефоне вряд ли будет. А передавать по мобильной сети бессмысленно, так как наш сервер находится в локальной сети.

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

Нажимаем кнопку "Синхронизация" в верхней части экрана и смотрим, началась ли синхронизация

Кратка информация по синхронизации есть на главном экране (продолжительность, скороть передачи, количество сравненных и переданных файлов

Задач на синхронизацию может быть несколько под разные типы файлов: фотографии, документы, резервные копии программ. Можно из нескольких папок на устройстве складывать файлы в одну папку в ownCloud, например, резервные копии программ - обычно каждая программа создает резервную копию в своей папке.

Решение получает простым, гибким и достаточно мощным.

вторник, 7 июня 2022 г.

ownCloud. Собственный Dropbox. Удобное резервное копирование данных со смартфона. Серверная часть

Задуматься над резервным копированием с телефона меня заставила потеря телефона, точнее его кража. Вторая причина - на старом телефоне, к которому вернулся, накопитель всего на 64 ГБ, часть емкости уже занята системной информацией. Фотографии и видео быстро заполняют весь накопитель. Удалять их жалко. Но держать на телефоне вечно тоже не получается.

Ручное перекладывание по USB-кабелю на компьютер - не выход. Можно сделать FTP или CIFS/NFS. Но это как-то несовременно. Выбрал ownCloud.

  • Есть бесплатная версия от сообщества.
  • Есть репозитории под Ubuntu, есть собственный платный (сейчас не очень актуально) и сторонние бесплатные клиенты.
  • Вся информация лежит на вашем сервере/хранилище.
  • Есть инструкции, как настраивать на русском и на английском
  • Есть веб-интерфейс для настройки и для просмотра сохраненных файлов
  • Есть поддержка нескольких пользователей. Можно сделать хранилища для других жителей квартиры. Ваши данные не будут путаться с их. Каждый будет иметь доступ только к своим данным. Ну не считая админа сервера :)
По мне - неплохой набор причин. Можете добавить свои. Есть два пути (а может и больше) установки и настройки ownCloud. Простой - использовать Docker и готовые контейнеры. Мне этот путь не нравится. Когда настроено не тобой, то не понятно, как чинить, если что-то пошло не так. Надо думать о сохранении настроек вне контейнеров и подгрузка их после обновления. Путь установки непосредственно на сервер длиннее, зато надежнее. Попутно получаешь базовые навыки по настройке не только самого ownCloud, но также Apache и MariaDB (форк MySQL). Краткий план установки такой:
  • Установка необходимых пакетов
  • Настройка Apache
  • Настройка MariaDB
  • Загрузка и установка ownCloud
  • Выбор места на сервере для хранения файлов
  • Настройка ownCloud
  • Поиск и исправление ошибок собственных и из используемых инструкций

За основу я взял инструкции с сайта проекта. С ними не всё гладко. Есть Detailed Installation Guide и Quick Installation Guide. Проблема в том, что некоторые пункты установки/настройки предлагается выполнить разными путями и в итоге с разным результатом. Поэтому моё руководство - это компиляция этих инструкций, а также сторонних статей. Источники даю по ходу рассказа.

  1. Устанавливаем Apache, MariaDB, PHP, а также служебные пакеты.
    evgeniy@owncloud-vm:~$ sudo apt update
    evgeniy@owncloud-vm:~$ sudo apt install apache2 libapache2-mod-php mariadb-server openssl redis-server wget php-imagick php-common php-curl php-gd php-gmp php-bcmath php-imap php-intl php-json php-mbstring php-mysql php-ssh2 php-xml php-zip php-apcu php-redis php-ldap php-phpseclib libsmbclient-dev php-dev php-pear

  2. Готовимся к работе с репозиторием PHP (PEAR):
    evgeniy@owncloud-vm:~$ sudo pecl channel-update pecl.php.net
    Updating channel "pecl.php.net"
    Update of Channel "pecl.php.net" succeeded


    Я не специалист в PHP, поэтому просто приведу цитату из man-страницы pecl
    PEAR is the PHP Extension and Application Repository, found at http://pear.php.net.
    The pear command is used to install PEAR extensions.
    The pecl command is used to install PECL extensions.

    Создаем папку для кэша PEAR
    evgeniy@ownclowd-vm:~$ mkdir -p /tmp/pear/cache

  3. Небольшое лирическое отступление. Я вначале использовал дистрибутив Ubuntu 18.04. Но в требованиях к ownCloud указан PHP 7.4, а для 18.04 стандартом идет 7.2. Поэтому я сделал do-release-update для дистрибутива, но уже после установки пакетов (пункты 1 и 2). Поэтому после обновления при запуске команды pecl у меня появлялись ошибки:
    evgeniy@owncloud-vm:~$ sudo pear channel-update pear.php.net
    PHP Warning:  PHP Startup: Unable to load dynamic library 'smbclient.so' (tried: /usr/lib/php/20190902/smbclient.so (/usr/lib/php/20190902/smbclient.so: cannot open shared object file: No such file or directory), /usr/lib/php/20190902/smbclient.so.so (/usr/lib/php/20190902/smbclient.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
    
    Notice: Trying to access array offset on value of type bool in PEAR/REST.php on line 187
    PHP Notice:  Trying to access array offset on value of type bool in /usr/share/php/PEAR/REST.php on line 187
    Проблема была решена следующим набором команд - обновление PEAR до версии 1.10.13 (рекомендуется в подробной инструкции, в краткой такого нет) и принудительное обновление состава пакетов из репозитория:
    evgeniy@owncloud-vm:~$ pear version
    evgeniy@owncloud-vm:~$ sudo pear upgrade --force --alldeps http://pear.php.net/get/PEAR-1.10.13
    evgeniy@owncloud-vm:~$ sudo pear clear-cache
    evgeniy@owncloud-vm:~$ sudo pear update-channels
    evgeniy@owncloud-vm:~$ sudo pear upgrade --force
    evgeniy@owncloud-vm:~$ sudo pear upgrade-all
    evgeniy@owncloud-vm:~$ pear version
  4. Ставим клиент SMB для PHP и активируем его
    evgeniy@owncloud-vm:~$ sudo pecl install smbclient-stable
    downloading smbclient-1.0.6.tgz ...
    Starting to download smbclient-1.0.6.tgz (33,207 bytes)
    .........done: 33,207 bytes 
    ....
    
    evgeniy@test:~$ echo "extension=smbclient.so" | sudo tee /etc/php/7.4/mods-available/smbclient.ini
    extension=smbclient.so
    evgeniy@owncloud-vm:~$ sudo phpenmod smbclient
    Перезапускаем Apache и проверяем, что модуль SMB загружен:
    evgeniy@owncloud-vm:~$ sudo systemctl restart apache2
    evgeniy@owncloud-vm:~$ php -m |grep smbclient
    В выводе команды должны быть модули libsmbclient и smbclient.

  5. Ставим еще немного пакетов
    evgeniy@owncloud-vm:~$ sudo apt install unzip bzip2 rsync curl jq inetutils-ping ldap-utils smbclient

  6. Сохраняем в переменную IP-адрес, придумываем и сохраняем в переменную доменное имя (FQDN) сервера
    evgeniy@owncloud-vm:~$ my_ip=$(hostname -I|cut -f1 -d ' ')
    evgeniy@owncloud-vm:~$ my_domain="test.owncloud.local"
    Меняем имя сервера на то, что мы сохранили в переменную my_domain
    evgeniy@owncloud-vm:~$ hostnamectl -f
    owncloud-vm
    evgeniy@owncloud-vm:~$ sudo hostnamectl set-hostname $my_domain
    evgeniy@owncloud-vm:~$ hostname -f
    test.owncloud.local

  7. Настраиваем MariaDB. Запускаем "Мастер установки". Я дал следующие ответы на его вопросы:
    evgeniy@test:~$ sudo mysql_secure_installation
    
    NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
          SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!
    
    In order to log into MariaDB to secure it, we'll need the current
    password for the root user.  If you've just installed MariaDB, and
    you haven't set the root password yet, the password will be blank,
    so you should just press enter here.
    
    Enter current password for root (enter for none):
    OK, successfully used password, moving on...
    
    Setting the root password ensures that nobody can log into the MariaDB
    root user without the proper authorisation.
    
    Set root password? [Y/n] y
    New password:<пароль для root>
    Re-enter new password:<пароль для root>
    Password updated successfully!
    Reloading privilege tables..
     ... Success!
    
    
    By default, a MariaDB installation has an anonymous user, allowing anyone
    to log into MariaDB without having to have a user account created for
    them.  This is intended only for testing, and to make the installation
    go a bit smoother.  You should remove them before moving into a
    production environment.
    
    Remove anonymous users? [Y/n] n
     ... skipping.
    
    Normally, root should only be allowed to connect from 'localhost'.  This
    ensures that someone cannot guess at the root password from the network.
    
    Disallow root login remotely? [Y/n]
     ... Success!
    
    By default, MariaDB comes with a database named 'test' that anyone can
    access.  This is also intended only for testing, and should be removed
    before moving into a production environment.
    
    Remove test database and access to it? [Y/n]
     - Dropping test database...
     ... Success!
     - Removing privileges on test database...
     ... Success!
    
    Reloading the privilege tables will ensure that all changes made so far
    will take effect immediately.
    
    Reload privilege tables now? [Y/n]
     ... Success!
    
    Cleaning up...
    
    All done!  If you've completed all of the above steps, your MariaDB
    installation should now be secure.
    
    Thanks for using MariaDB!
    Проверяем версию , ну и что есть доступ к консоли администратора
    evgeniy@test:~$ mysqladmin -u root -p version
    Enter password:
    mysqladmin  Ver 9.1 Distrib 10.3.34-MariaDB, for debian-linux-gnu on x86_64
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Server version          10.3.34-MariaDB-0ubuntu0.20.04.1
    Protocol version        10
    Connection              Localhost via UNIX socket
    UNIX socket             /var/run/mysqld/mysqld.sock
    Uptime:                 1 hour 34 min 35 sec
    
    Threads: 6  Questions: 74  Slow queries: 0  Opens: 33  Flush tables: 1  Open tables: 26  Queries per second avg: 0.013
    Какая может быть проблема. У меня эта команда выдавала ошибку доступа. Если запускать ее с sudo, то команда работала корректно. Аналогичная история была с командой "mysql -u root"
    Это можно исправить следующим набором команд:
    evgeniy@test:~$ sudo mysql -u root
    [mysql] use mysql;
    [mysql] update user set plugin='' where User='root';
    [mysql] flush privileges;
    [mysql] \q
    Команда из инструкции к ownCloud
    evgeniy@test:~$ sudo sed -i "/\[mysqld\]/atransaction-isolation = READ-COMMITTED\nperformance_schema = on" /etc/mysql/mariadb.conf.d/50-server.cnf

    Перезапускаем сервер БД и проверяем его статус:
    evgeniy@test:~$ sudo systemctl restart mariadb
    evgeniy@test:~$ sudo systemctl status mariadb
    ● mariadb.service - MariaDB 10.3.34 database server
         Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
         Active: active (running) since Sun 2022-06-05 00:03:15 MSK; 31s ago
           Docs: man:mysqld(8)
                 https://mariadb.com/kb/en/library/systemd/
        Process: 1253 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=0/SUCCESS)
        Process: 1264 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
        Process: 1266 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= ||   VAR=`cd /usr/bin/..; /usr/bin/galera_recovery`; [ $? -eq 0 ]   &>
        Process: 1350 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
        Process: 1352 ExecStartPost=/etc/mysql/debian-start (code=exited, status=0/SUCCESS)
       Main PID: 1319 (mysqld)
         Status: "Taking your SQL requests now..."
          Tasks: 31 (limit: 1103)
         Memory: 168.2M
         CGroup: /system.slice/mariadb.service
                 └─1319 /usr/sbin/mysqld
    
    Jun 05 00:03:15 test.owncloud.local systemd[1]: Started MariaDB 10.3.34 database server.
    Jun 05 00:03:15 test.owncloud.local /etc/mysql/debian-start[1354]: Upgrading MySQL tables if necessary.
    Jun 05 00:03:15 test.owncloud.local /etc/mysql/debian-start[1357]: /usr/bin/mysql_upgrade: the '--basedir' option is always ignored
    Jun 05 00:03:15 test.owncloud.local /etc/mysql/debian-start[1357]: Looking for 'mysql' as: /usr/bin/mysql
    Jun 05 00:03:15 test.owncloud.local /etc/mysql/debian-start[1357]: Looking for 'mysqlcheck' as: /usr/bin/mysqlcheck
    Jun 05 00:03:15 test.owncloud.local /etc/mysql/debian-start[1357]: This installation of MariaDB is already upgraded to 10.3.34-MariaDB.
    Jun 05 00:03:15 test.owncloud.local /etc/mysql/debian-start[1357]: There is no need to run mysql_upgrade again for 10.3.34-MariaDB.
    Jun 05 00:03:15 test.owncloud.local /etc/mysql/debian-start[1357]: You can use --force if you still want to run mysql_upgrade
    Jun 05 00:03:15 test.owncloud.local /etc/mysql/debian-start[1365]: Checking for insecure root accounts.
    Jun 05 00:03:15 test.owncloud.local /etc/mysql/debian-start[1369]: Triggering myisam-recover for all MyISAM tables and aria-recover for all Aria tables
    lines 1-27/27 (END)

    C этим разобрались. Идем дальше
  8. Настраиваем Apache. Включаем необходимые модули:
    evgeniy@test:~$ sudo a2enmod rewrite headers env dir mime unique_id ssl

    Для того, чтобы правильно работал выбранный мною клиент, да и вообще для безопасности, нужно использовать протокол HTTPS. Для этого надо сгенерировать ключи для SSL. Создаем директорию для ключей, переходим в нее и генерируем ключи. В качестве Common Name используем доменное имя сервера (FQDN), которое мы создали в пункте 6. в моем случае это "test.owncloud.local"
    evgeniy@test:~$ sudo mkdir /etc/apache2/certificate
    evgeniy@test:~$ cd /etc/apache2/certificate/
    evgeniy@test:/etc/apache2/certificate$ sudo openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -out apache-certificate.crt -keyout apache.key
    Generating a RSA private key
    .............................................++++
    .................++++
    writing new private key to 'apache.key'
    -----
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [AU]:RU
    State or Province Name (full name) [Some-State]:Moscow
    Locality Name (eg, city) []:Moscow
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:Home
    Organizational Unit Name (eg, section) []:
    Common Name (e.g. server FQDN or YOUR name) []:test.owncloud.local
    Email Address []:

  9. Создаем файл конфигурации нашей директории в Apache:
    evgeniy@test:~$ sudo vim /etc/apache2/sites-available/owncloud.conf
    Следующего содержания:
    Alias /owncloud "/var/www/owncloud"
    <Directory /var/www/owncloud>
      Options +FollowSymlinks
      AllowOverride All
      Require all granted
      Satisfy Any
     <IfModule mod_dav.c>
      Dav off
     </IfModule>
    </Directory>
    Активируем ее:
    evgeniy@test:~$ sudo a2ensite owncloud.conf
    Enabling site owncloud.
    To activate the new configuration, you need to run:
      systemctl reload apache2
  10. Настраиваем Apache на работу с HTTPS. При обращении по протоколу HTTP (порт 80) клиент будет перенаправляться на порт HTTPS (443). Редактируем файл 000-default.conf
    evgeniy@test:~$ sudo vim /etc/apache2/sites-available/000-default.conf
    Содержание такое:
    <VirtualHost *:80>
            RewriteEngine On
            RewriteCond %{HTTPS} !=on
            RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L]
    </virtualhost>
    <VirtualHost *:443>
            ServerAdmin webmaster@localhost
            DocumentRoot /var/www/html
            ErrorLog ${APACHE_LOG_DIR}/error.log
            CustomLog ${APACHE_LOG_DIR}/access.log combined
            SSLEngine on
            SSLCertificateFile /etc/apache2/certificate/apache-certificate.crt
            SSLCertificateKeyFile /etc/apache2/certificate/apache.key
    </VirtualHost>
    Активируем:
    evgeniy@test:~$ sudo a2ensite 000-default.conf
    Enabling site 000-default.
    To activate the new configuration, you need to run:
      systemctl reload apache2
    Перезапускаем Apache:
    evgeniy@test:~$ sudo systemctl restart apache2
  11. И вот, наконец, дошли до установки самого ownCloud. Я использую загрузку и распаковку архива. Так исторически сложилось. Но рекомендую использовать готовые пакеты. Инструкция, как добавить репозиторий тут. Ставить надо пакет owncloud-complete-files.

    Загружка, распаковка, смена владельца:
    evgeniy@test:~$ cd /var/www
    evgeniy@test:/var/www$ sudo wget https://download.owncloud.com/server/stable/owncloud-complete-latest.tar.bz2
    --2022-06-05 00:11:58--  https://download.owncloud.com/server/stable/owncloud-complete-latest.tar.bz2
    Resolving download.owncloud.com (download.owncloud.com)... 167.233.14.167, 2a01:4f8:1c1d:3d1::1
    Connecting to download.owncloud.com (download.owncloud.com)|167.233.14.167|:443... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 79062710 (75M) [application/x-bzip2]
    Saving to: ‘owncloud-complete-latest.tar.bz2’
    
    owncloud-complete-latest.tar.bz2        100%[============================================================================>]  75.40M  1.08MB/s    in 1m 45s
    
    2022-06-05 00:13:44 (734 KB/s) - ‘owncloud-complete-latest.tar.bz2’ saved [79062710/79062710]
    
    evgeniy@test:/var/www$ sudo tar -xjf owncloud-complete-latest.tar.bz2
    
    evgeniy@test:/var/www$ sudo chown -R www-data. owncloud

  12. Запуск установщика:
    evgeniy@test:/var/www$ cd /var/www/owncloud
    evgeniy@test:/var/www/owncloud$ sudo -u www-data ./occ maintenance:install --database "mysql" --database-name "owncloud" --database-user "root" --database-pass "123456" --data-dir "/var/www/owncloud/data" --admin-user "admin" --admin-pass "123456"
    Все идентификаторы (имена пользователей, пароли) надо поменять на используемые у вас.

    Если что-то пошло не так и надо удалить базу данных ownCloud, то проверяем, что база есть и каково ее имя, удаляем, проверяем, что операция прошла успешно:
    evgeniy@test:~$ sudo mysql -u root -e "SHOW DATABASES";
    evgeniy@test:~$ sudo mysql -u root -e "DROP DATABASE owncloud";
    evgeniy@test:~$ sudo mysql -u root -e "SHOW DATABASES";
    
  13. Нужно IP-адрес сервера и его FQDN добавить в доверенные домены ownCloud:
    evgeniy@test:/var/www/owncloud$ sudo -u www-data ./occ config:system:set trusted_domains 1 --value="$my_ip"
    System config value trusted_domains => 1 set to string 172.16.1.213
    evgeniy@test:/var/www/owncloud$ sudo -u www-data ./occ config:system:set trusted_domains 2 --value="$my_domain"
    System config value trusted_domains => 2 set to string test.owncloud.local
    
  14. Задачи для Cron'a:
    evgeniy@test:~$ echo "*/15  *  *  *  * /var/www/owncloud/occ system:cron" | sudo -u www-data -g crontab tee -a /var/spool/cron/crontabs/www-data 
    */15  *  *  *  * /var/www/owncloud/occ system:cron
    evgeniy@test:~$ echo "0  2  *  *  * /var/www/owncloud/occ dav:cleanup-chunks" | sudo -u www-data -g crontab tee -a /var/spool/cron/crontabs/www-data
    0  2  *  *  * /var/www/owncloud/occ dav:cleanup-chunks
  15. На этом этапе ownCloud должен быть доступен в браузере по IP-адресу вашего сервера (протокол HTTPS - порт 443).
    Пока есть один пользователь admin. Пароль для него задан при установке (пункт 12), параметр --admin-pass.
    Вид интерфеса после авторизации:
  16. Перенос каталога с данными. По умолчанию данные хранятся в каталоге "/var/www/owncloud/data/". Правильнее хранить данные на отдельном диске, возможно, сетевом или на RAID-массиве. Далее преполагается, что целевой том для данных смонтирован по пути "/mnt/owncloud". Инструкция, как это сделать на официальном сайте. Но в ней неточности с путями. Вначале я сделал по инструкции, и у меня не заработало - файлы были недоступны. Я создал нового пользователя, и его каталог файлов лежал по правильному пути и был доступен. Сравнение записей в таблицах показало, где ошибка.
    Переводим ownCloud в сервисный режим и останавливаем Apache:
    evgeniy@test:~$ cd /var/www/owncloud
    evgeniy@test:/var/www/owncloud$ sudo -u www-data php occ maintenance:mode --on
    Maintenance mode enabled
    Please also consider to stop the web server on all ownCloud instances
    
    evgeniy@test:/var/www/owncloud$ sudo systemctl stop apache2.service
    Создаем каталог, если он еще не создан, и переносим в него файлы:
    evgeniy@test:/var/www/owncloud$ sudo mkdir /mnt/owncloud
    evgeniy@test:/var/www/owncloud$ sudo chown www-data /mnt/owncloud
    evgeniy@test:/var/www/owncloud$ sudo rsync -avz /var/www/owncloud/data /mnt/owncloud
    sending incremental file list
    data/
    data/.htaccess
    data/.ocdata
    data/htaccesstest.txt
    data/index.html
    data/owncloud.log
    data/admin/
    data/admin/cache/
    data/admin/files/
    data/admin/files/ownCloud Manual.pdf
    data/admin/files/Documents/
    data/admin/files/Documents/Example.odt
    data/admin/files/Photos/
    data/admin/files/Photos/Lake-Constance.jpg
    data/admin/files/Photos/Portugal.jpg
    data/admin/files/Photos/Teotihuacan.jpg
    data/avatars/
    data/files_external/
    data/files_external/rootcerts.crt
    
    sent 6,985,083 bytes  received 277 bytes  13,970,720.00 bytes/sec
    total size is 8,178,313  speedup is 1.17
    Манипуляции с базой данных. Заходим на сервер БД клиентом:
    evgeniy@test:/var/www/owncloud$ mysql -u root -p
    Enter password:
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 45
    Server version: 10.3.34-MariaDB-0ubuntu0.20.04.1 Ubuntu 20.04
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    Выбираем нашу базу:
    MariaDB [(none)]> use owncloud
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    Смотрим список пользователей и у каждого меняем путь. Если уже создано несколько пользователей, то используем поле id для их идентичификации. Если вы делаете эту процедуру сразу после установки ownCloud, то будет только один пользователь - admin.
    MariaDB [owncloud]> select * from oc_accounts;
    +----+-------+---------+---------------+--------------+-------+------------+------------------+------------------------------+-------+
    | id | email | user_id | lower_user_id | display_name | quota | last_login | backend          | home                         | state |
    +----+-------+---------+---------------+--------------+-------+------------+------------------+------------------------------+-------+
    |  1 | NULL  | admin   | admin         | admin        | NULL  | 1654386521 | OC\User\Database | /var/www/owncloud/data/admin |     1 |
    +----+-------+---------+---------------+--------------+-------+------------+------------------+------------------------------+-------+
    1 row in set (0.000 sec)
    
    MariaDB [owncloud]> UPDATE oc_accounts SET home='/mnt/owncloud/data/admin' WHERE id=1;
    Query OK, 1 row affected (0.033 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    Теперь надо сделать выборку по задачам и проверить, нет ли у какой-либо задачи старого пути. У меня таких не нашлось.
    MariaDB [owncloud]> select * from oc_jobs where class = 'OC\Log\Rotate';
    Empty set (0.000 sec)
    
    MariaDB [owncloud]> select * from oc_jobs
        -> ;
    +----+----------------------------------------------------+----------+------------+--------------+-------------+--------------------+
    | id | class                                              | argument | last_run   | last_checked | reserved_at | execution_duration |
    +----+----------------------------------------------------+----------+------------+--------------+-------------+--------------------+
    |  1 | OCA\Files\BackgroundJob\ScanFiles                  | null     | 1654386430 |   1654386430 |           0 |                  0 |
    |  2 | OCA\Files\BackgroundJob\DeleteOrphanedItems        | null     | 1654386437 |   1654386437 |           0 |                  0 |
    |  3 | OCA\Files\BackgroundJob\CleanupFileLocks           | null     | 1654386444 |   1654386444 |           0 |                  0 |
    |  4 | OCA\Files\BackgroundJob\CleanupPersistentFileLocks | null     | 1654386477 |   1654386477 |           0 |                  0 |
    |  5 | OCA\DAV\CardDAV\SyncJob                            | null     | 1654386505 |   1654386505 |           0 |                  0 |
    |  6 | OCA\DAV\BackgroundJob\CleanProperties              | null     | 1654386522 |   1654386521 |           0 |                  0 |
    |  7 | OCA\Activity\BackgroundJob\EmailNotification       | null     | 1654386739 |   1654386739 |           0 |                  0 |
    |  8 | OCA\Activity\BackgroundJob\ExpireActivities        | null     | 1654386749 |   1654386749 |           0 |                  0 |
    |  9 | OCA\Federation\SyncJob                             | null     | 1654386752 |   1654386752 |           0 |                  0 |
    | 10 | OCA\Files_Sharing\DeleteOrphanedSharesJob          | null     | 1654386761 |   1654386761 |           0 |                  0 |
    | 11 | OCA\Files_Sharing\ExpireSharesJob                  | null     | 1654386770 |   1654386770 |           0 |                  0 |
    | 12 | OCA\Files_Sharing\External\ScanExternalSharesJob   | null     | 1654386775 |   1654386775 |           0 |                  0 |
    | 13 | OCA\Files_Trashbin\BackgroundJob\ExpireTrash       | null     | 1654386795 |   1654386795 |           0 |                  0 |
    | 14 | OCA\Files_Versions\BackgroundJob\ExpireVersions    | null     | 1654386833 |   1654386833 |           0 |                  0 |
    | 15 | OCA\Market\CheckUpdateBackgroundJob                | null     |          0 |   1654386024 |           0 |                 -1 |
    | 16 | OCA\UpdateNotification\Notification\BackgroundJob  | null     |          0 |   1654386025 |           0 |                 -1 |
    | 17 | \OC\Authentication\Token\DefaultTokenCleanupJob    | null     |          0 |   1654386026 |           0 |                 -1 |
    +----+----------------------------------------------------+----------+------------+--------------+-------------+--------------------+
    17 rows in set (0.000 sec)
    Если задача есть, то выполните запрос:
    MariaDB [owncloud]> UPDATE oc_jobs SET argument = REPLACE(argument, '\\/var\\/www\\/owncloud\\/data\\/', '\\/mnt\\/owncloud/data\\/')   WHERE id = <id of the incorrect record>;
    где в <id of the incorrect record> подставить id с записью, у которой неверный путь. Выходим из БД:
    MariaDB [owncloud]> \q
    Bye
    Проверяем пути в приложениях. Если у какого-то приложения есть старый путь, то меняем его (команда ниже). В моем случае такого приложения не нашлось.
    evgeniy@test:/var/www/owncloud$ sudo -u www-data php ./occ config:list
    {
        "system": {
            "instanceid": "oc8mwxq3rfxl",
            "passwordsalt": "***REMOVED SENSITIVE VALUE***",
            "secret": "***REMOVED SENSITIVE VALUE***",
            "trusted_domains": [
                "localhost",
                "172.16.1.213",
                "test.owncloud.local"
            ],
            "datadirectory": "\/mnt\/owncloud\/data",
            "overwrite.cli.url": "http:\/\/localhost",
            "dbtype": "mysql",
            "version": "10.10.0.3",
            "dbname": "owncloud",
            "dbhost": "localhost",
            "dbtableprefix": "oc_",
            "mysql.utf8mb4": true,
            "dbuser": "***REMOVED SENSITIVE VALUE***",
            "dbpassword": "***REMOVED SENSITIVE VALUE***",
            "allow_user_to_change_mail_address": "",
            "logtimezone": "UTC",
            "apps_paths": [
                {
                    "path": "\/var\/www\/owncloud\/apps",
                    "url": "\/apps",
                    "writable": false
                },
                {
                    "path": "\/var\/www\/owncloud\/apps-external",
                    "url": "\/apps-external",
                    "writable": true
                }
            ],
            "installed": true,
            "maintenance": false
        },
        "apps": {
            "activity": {
                "enabled": "yes",
                "installed_version": "2.7.0",
                "types": "filesystem"
            },
            "backgroundjob": {
                "lastjob": "14"
            },
            "comments": {
                "enabled": "yes",
                "installed_version": "0.3.0",
                "types": "logging,dav"
            },
            "configreport": {
                "enabled": "yes",
                "installed_version": "0.2.1",
                "types": "filesystem"
            },
    ........
            "updatenotification": {
                "enabled": "yes",
                "installed_version": "0.2.1",
                "types": ""
            }
        }
    }
    Команда для замены (не проверял):
    evgeniy@test:/var/www/owncloud$ sudo -u www-data php ./occ config:app:set --value /mnt/owncloud/data <название приложения> <имя параметра, содержащего путь к каталогу>
    И, наконец, исправляем путь в файле настроек, параметр datadirectory:
    evgeniy@test:/var/www/owncloud$ sudo vim /var/www/owncloud/config/config.php
    <?php
    $CONFIG = array (
      'instanceid' => 'oc8mwxq3rfxl',
      'passwordsalt' => 'ahNk4VxR1R5DeZyJ9ly8wsdqCXo1z3',
      'secret' => 'b8xm+wxPuQFyuW0syudVGGsKQwgfnTFoMEBm6cZA00Wm2zG0',
      'trusted_domains' =>
      array (
        0 => 'localhost',
        1 => '172.16.1.213',
        2 => 'test.owncloud.local',
      ),
      'datadirectory' => '/mnt/owncloud/data',
      'overwrite.cli.url' => 'http://localhost',
      'dbtype' => 'mysql',
      'version' => '10.10.0.3',
      'dbname' => 'owncloud',
      'dbhost' => 'localhost',
      'dbtableprefix' => 'oc_',
      'mysql.utf8mb4' => true,
      'dbuser' => 'oc_admin',
      'dbpassword' => 'WeBkvHU7WqHPQ/7Sxm0Oq4rVs1vAEh',
      'allow_user_to_change_mail_address' => '',
      'logtimezone' => 'UTC',
      'apps_paths' =>
      array (
        0 =>
        array (
          'path' => '/var/www/owncloud/apps',
          'url' => '/apps',
          'writable' => false,
        ),
        1 =>
        array (
          'path' => '/var/www/owncloud/apps-external',
          'url' => '/apps-external',
          'writable' => true,
        ),
      ),
      'installed' => true,
      'maintenance' => false,
    );
    Возвращаем ownCloud в боевой режим и запускаем Apache:
    evgeniy@test:/var/www/owncloud$ sudo -u www-data php occ maintenance:mode --off
    ownCloud is in maintenance mode - no app have been loaded
    
    Maintenance mode disabled
    
    evgeniy@test:/var/www/owncloud$ sudo systemctl start apache2.service
    
  17. Поздравляю, на этом настройка серверной части завершена. Можно пользоваться веб-интерфейсом. Настройку клиента на Андроиде рассмотрю в следующей статье.

воскресенье, 6 февраля 2022 г.

Установка Mosquitto MQTT Broker

Продолжаем эксперименты с самопальным умным домом, до которого еще оччччень далеко. В этой статье был прошит Zigbee-сниффер. А в этой установлена Ubuntu Server 20.04 на Banana PI M5.

Теперь на очереди настройка брокера MQTT - Mosquitto MQTT Broker. Что такое Message Queuing Telemetry Transport (MQTT) можно почитать тут. Брокер собирает с сервера-издателя, в нашем случае это будет Zigbee2MQTT, данные с датчиков, точнее Zigbee2MQTT сам посылает их в заданный канал брокера. А программы-клиенты, в нашем случае это будет Home Assistant считывает из канала показания датчиков(и не только).

В настройке я шел по советам Стива, поэтому данный текст можно назвать переводом выжимки из его статьи. В оригинале рассматривается установка под разные ОС, изменение лимита открытых файлов (наверное, актуально для больших инсталляций, возможно, придется к этому вернуться), запуск нескольких экземпляров брокера.

Начнем. Нужно добавить репозиторий, из которого будет ставиться брокер:

pi@ubuntu:~$ sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
pi@ubuntu:~$ sudo apt-get update
pi@ubuntu:~$ sudo apt-get install mosquitto mosquitto-clients

Mosquitto ставится как демон. Попробуем запустить его в интерактивном режиме. Останавливаем демон:
pi@ubuntu:~$ sudo systemctl stop mosquitto.service Запускаем Mosquitto из командной строки:

pi@ubuntu:~$ mosquitto -v
1644094311: mosquitto version 2.0.14 starting
1644094311: Using default config.
1644094311: Starting in local only mode. Connections will only be possible from clients running on this machine.
1644094311: Create a configuration file which defines a listener to allow remote access.
1644094311: For more details see https://mosquitto.org/documentation/authentication-methods/
1644094311: Opening ipv4 listen socket on port 1883.
1644094311: Opening ipv6 listen socket on port 1883.
1644094311: mosquitto version 2.0.14 running
1644094311: New connection from 127.0.0.1:48812 on port 1883.
1644094311: New client connected from 127.0.0.1:48812 as mqttjs_69852d1b (p2, c1, k60).
Видим, что он успешно занял порт 1883 для ipv4 и ipv6. Можно проверить
pi@ubuntu:~$ sudo netstat -tunlp |grep 1883
tcp        0      0 0.0.0.0:1883            0.0.0.0:*               LISTEN      17896/mosquitto     
tcp6       0      0 :::1883                 :::*                    LISTEN      17896/mosquitto
Тут статья, как посмотреть открытые сетевые порты в Linux.

Останавливаем интерактивный экземпляр Mosquitto и запускаем обратно демон: pi@ubuntu:~$ sudo systemctl start mosquitto.service Проверяем, что демон запустился.

pi@ubuntu:~$ sudo systemctl status mosquitto.service 
● mosquitto.service - Mosquitto MQTT Broker
        Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled)
        Active: active (running) since Sat 2022-02-05 20:55:20 UTC; 25min ago
        Docs: man:mosquitto.conf(5)
                man:mosquitto(8)
    Process: 17885 ExecStartPre=/bin/mkdir -m 740 -p /var/log/mosquitto (code=exited, status=0/SUCCESS)
    Process: 17891 ExecStartPre=/bin/chown mosquitto /var/log/mosquitto (code=exited, status=0/SUCCESS)
    Process: 17894 ExecStartPre=/bin/mkdir -m 740 -p /run/mosquitto (code=exited, status=0/SUCCESS)
    Process: 17895 ExecStartPre=/bin/chown mosquitto /run/mosquitto (code=exited, status=0/SUCCESS)
    Main PID: 17896 (mosquitto)
        Tasks: 1 (limit: 3839)
        Memory: 1.0M
        CGroup: /system.slice/mosquitto.service
                └─17896 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

Feb 05 20:55:20 ubuntu systemd[1]: Starting Mosquitto MQTT Broker...
Feb 05 20:55:20 ubuntu systemd[1]: Started Mosquitto MQTT Broker.
Отлично.

Теперь протестируем, что сообщения передаются от издеталя клиенту. Инструкции взяты тут. Потребуется 3 SSH-сессии. Одна будет издателем и две будут подписчиками. Итак, сессия №1. Подписываемся на канал testTopic:

pi@ubuntu:~$ mosquitto_sub -d -t testTopic
Client null sending CONNECT
Client null received CONNACK (0)
Client null sending SUBSCRIBE (Mid: 1, Topic: testTopic, QoS: 0, Options: 0x00)
Client null received SUBACK
Subscribed (mid: 1): 0

Из второй сессии отправляем сообщение в канал testTopic

pi@ubuntu:~$ mosquitto_pub -d -t testTopic -m "Привет, Москва!"
Client null sending CONNECT
Client null received CONNACK (0)
Client null sending PUBLISH (d0, q0, r0, m1, 'testTopic', ... (27 bytes))
Client null sending DISCONNECT

В первой сессии мы увидим наше сообщение:

Client null sending PINGREQ
Client null received PINGRESP
Client null received PUBLISH (d0, q0, r0, m0, 'testTopic', ... (27 bytes))
Привет, Москва!

В сессии №3 тоже подписываемся на канал testTopic:

pi@ubuntu:~$ mosquitto_sub -d -t testTopic
Client null sending CONNECT
Client null received CONNACK (0)
Client null sending SUBSCRIBE (Mid: 1, Topic: testTopic, QoS: 0, Options: 0x00)
Client null received SUBACK
Subscribed (mid: 1): 0

Из второй сессии отправляем сообщение в канал testTopic

pi@ubuntu:~$ mosquitto_pub -d -t testTopic -m "И вам не хворать, коль не шутите"
Client null sending CONNECT
Client null received CONNACK (0)
Client null sending PUBLISH (d0, q0, r0, m1, 'testTopic', ... (27 bytes))
Client null sending DISCONNECT

В первой и третьей сессиях должно появится ваше сообщение:

Client null received SUBACK
Subscribed (mid: 1): 0
Client null received PUBLISH (d0, q0, r0, m0, 'testTopic', ... (57 bytes))
И вам не хворать, коль не шутите

В файл конфигурации /etc/mosquitto/mosquitto.conf я добавил следующие строки:
pi@ubuntu:~$ sudo vim /etc/mosquitto/mosquitto.conf
listener 1883
allow_anonymous true

Следующая на очереди статья - настройка Zigbee2MQTT

пятница, 4 февраля 2022 г.

Первый запуск Banana PI M5. Установка Ubuntu Server 20.04

Долгое вступление

Медленно продвигаюсь со своей идеей мониторинга жилплощади. Первая статья - "Чем прошить Zigbee-контроллер на Mac OS". Приехала ко мне от Алика Banana PI M5. Хотел купить Raspberry PI 4. Но за нормальную цену ее не взять. При цене у производителя за модель 4 ГБ в районе 4 тыс., ни в России, ни на Алике дешевле 10-11 тыс ее не найти. Поэтому решил рискнуть и взять китайский аналог. Если интересно, брал тут. Приехало в плотной картонной коробке, в которой уже лежала родная упаковка. Кроме самой платы ничего в комплекте не приходит. Сравнение с Raspberry можно посмотреть тут.

Какие особенности надо иметь в виду:

  • Она китайская
  • Сообщество меньше, чем у Raspberry
  • Есть встроенный накопитель на 16 ГБ (удобно, но из-за него танцы с бубном
  • Нет Wi-Fi
  • Объем оперативной памяти - 4 ГБ
  • Есть технологические кнопки и есть кнопка Reset (удобно)

Что потребуется для запуска:

  • Сама плата
  • Компьютер, желательно с Linux или Mac OS
  • MicroSD на 8-16 ГБ
  • Флешка USB на 4 ГБ и более
  • Блок питания с кабелем USB-C
  • Монитор с кабелем HDMI
  • DHCP-сервер с доступом к его списку выданных IP-адресов. Это может быть, например, домашний роутер
  • Немного терпения
  • Знание английского, если моей статьи будет недостаточно
  • Пиво

У проекта есть неплохая Вики. В целом ее и базовых знаний Linux достаточно. Но, как мне показалось, аппаратная часть в ней описана заметно подробнее программной:)


В поисках образа

Немного об особенностях. Так как плата имеет внутренний накопитель, то он имеет приоритет надо USB и microSD. Как я понял, плата приходит с неким загрузиком, записанным на внутренний накопитель, причем, этот загрузчик для Андроида. Если он не находит ОС на внутреннем накопителе, то он ищет на внешних (microSD). Но он не умеет грузить флешки, прошитые стандартными образами ОС. Я пробовал флешки с RaspberryOS и Ubuntu. Поэтому для первого запуска подходят только "родные" образы.

С их закачкой я промучился долго. Заказчка постоянно обрывалась. Интернет у меня хороший, дело в чем-то другом: в настройке сервере, в большой нагрузке, не знаю... Пробовал я с разных компьютеров, разными браузерами. Safari вообще отказался открывать страницу репозитория. В виде жеста отчаяния я решил попробовать wget. И о чудо, это сработало. При каждом обрыве связи ему удавалось начать заказчку с места обрыва. Иногда он писал, что начал качать с нуля, но потом перескакивал на нужное место. И так за 15 обрывов он файл с ОС выкачал. Поэтому не теряйте время с браузерами, сразу качайте через wget. Точнее не совсем так. Вам нужна ссылка на файл (если приведенная ниже "сломается"). Поэтому пытаемся один раз скачать браузером.

Из меню закачек копируем настоящую ссылку на файл.
подставляем ее во wget:
wget -v https://download.banana-pi.dev/seafhttp/files/129e07cc-8452-40da-8ac3-36b55dbbd506/2021-06-21-ubuntu-20.04-server-bpi-m5-m2pro-aarch64-sd-emmc.img.zip

Рекомендую проверить контрольную сумму скаченного файла. Контрольная сумма в выводе команды должна сойтись с той, что написана в файле с расширением ".md5", лежащем в репозитории рядом с архивом, например, 2021-06-21-ubuntu-20.04-server-bpi-m5-m2pro-aarch64-sd-emmc.img.zip.md5

  • Mac OS
    md5 2021-06-21-ubuntu-20.04-server-bpi-m5-m2pro-aarch64-sd-emmc.img.zip
  • Linux
    md5sum 2021-06-21-ubuntu-20.04-server-bpi-m5-m2pro-aarch64-sd-emmc.img.zip

Теперь разворачиваем образ на microSD. Я использовал программу balenaEtcher.

А еще архив образа ОС копируем USB-флешку. Она понадобится позже.

Ставим ОС

Всё, теперь вставляем microSD в плату, подключаем монитор, проводную сеть и питание платы. Должна загореться красная лампочка, а синяя начать мигать с частотой раз в секунду. Если обе лампочки горят постоянно, и ничего не происходит на экране, значит система не может загрузиться microSD. У меня так было с неродными образами ОС.

Если этот этап пройден успешно, ждем, когда система загрузится У меня загрузка надолго останавливалась на пункте Amlogic A/V streaming port init.

Учетная запись на Ubuntu: pi/bananapi. На DHCP-сервере надо найти, какой IP-адрес был выдан нашей плате.

Следующим этапом надо прошить образ ОС на внутренний накопитель. Я использовал SSH для настройки ОС. Но можно пользоватья и локальной клавиатурой.

  1. На сервере запущена служба unattended-upgrades. Ее надо остановить и удалить, так как она будет блокировать менеджер пакетов apt, и не даст установить нужные утилиты:
    pi@ubuntu:~$ systemctl status unattended-upgrades.service 
    ● unattended-upgrades.service - Unattended Upgrades Shutdown
         Loaded: loaded (/lib/systemd/system/unattended-upgrades.service; enabled; vendor preset: enabled)
         Active: active (running) since Sat 2020-12-12 11:01:31 UTC; 1 years 1 months ago
           Docs: man:unattended-upgrade(8)
       Main PID: 2433 (unattended-upgr)
          Tasks: 2 (limit: 3839)
         Memory: 10.1M
         CGroup: /system.slice/unattended-upgrades.service
                 └─2433 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
    
    Dec 12 11:01:31 ubuntu systemd[1]: Started Unattended Upgrades Shutdown.
    
    pi@ubuntu:~$ sudo systemctl stop unattended-upgrades.service
    pi@ubuntu:~$ sudo apt purge unattended-upgrades
                    
  2. Вставляем USB-флешку с образом ОС. Смотрим подключенные устройства:
    pi@ubuntu:~$ lsblk -a
    NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    loop0          7:0    0 48.5M  1 loop /snap/core18/1883
    loop1          7:8    0 63.6M  1 loop /snap/lxd/16103
    loop2          7:16   0   26M  1 loop /snap/snapd/8543
    loop3          7:24   0 37.6M  1 loop /snap/snapd/14553
    loop4          7:32   0   49M  1 loop /snap/core18/2289
    loop5          7:40   0 57.5M  1 loop /snap/core20/1332
    loop6          7:48   0 60.7M  1 loop /snap/lxd/21843
    loop7          7:56   0        0 loop 
    sda            8:0    1  7.5G  0 disk <- USB-флешка
    └─sda1         8:1    1  7.5G  0 part 
    mmcblk0      179:0    0 14.6G  0 disk <- встроенный накопитель
    mmcblk0boot0 179:32   0    4M  0 disk 
    mmcblk0boot1 179:64   0    4M  0 disk 
    mmcblk0rpmb  179:96   0    4M  0 disk 
    mmcblk1      179:128  0 29.7G  0 disk <- microSD
    ├─mmcblk1p1  179:129  0  256M  0 part /boot/firmware
    └─mmcblk1p2  179:130  0 29.4G  0 part /
                    
    Создаем точку монтирования (каталог):
    pi@ubuntu:~$ ls /media/
    pi@ubuntu:~$ sudo mkdir /media/usb-flash
    Монтируем USB-флешку. Проверяем, что архив образа ОС на месте.
    pi@ubuntu:~$ sudo mount /dev/sda1 /media/usb-flash/
    pi@ubuntu:~$ ls /media/usb-flash/
    2021-06-21-ubuntu-20.04-server-bpi-m5-m2pro-aarch64-sd-emmc.img.zip
  3. Ставим нужные приложения
    pi@ubuntu:~$ sudo apt install unzip pv
  4. Переходим в root'a. Конвейером распаковываем архив и записываем его содержимое на внутренний накопитель:
    pi@ubuntu:/media/usb-flash$ sudo su
    root@ubuntu:/media/usb-flash# unzip -p ./2021-06-21-ubuntu-20.04-server-bpi-m5-m2pro-aarch64-sd-emmc.img.zip | pv |dd of=/dev/mmcblk0 bs=10M status=noxfer
    ^[[C6.55GiB 0:02:27 [53.6MiB/s] [                                                                                        <=>   7.12GiB 0:02:37 [46.2MiB/s] [                                                                              <=>                ]
    0+112926 records in
    0+112926 records out
    
  5. Гасим плату, вынимаем из нее USB-флешку и microSD.
    root@ubuntu:/media/usb-flash# shutdown -h now
  6. Включаем плату. Должна пойти загрузка с внутреннего накопителя с долгой остановкой на Amlogic A/V streaming port init. Красная лампочка горит постоянно, а синяя мигает с частотой 1 Гц.
  7. После входа в систему, удаляем unattended-upgrades (см. выше) и обновляем ОС.
    pi@ubuntu:~$ sudo apt update
    pi@ubuntu:~$ sudo apt dist-upgrade

Готово!

среда, 9 мая 2018 г.

В последний момент. Как сделать транспарант для "Бессмертного полка"

Сегодня речь не о компьютерах. Накануне шествия потребовалось сделать два транспаранта с портретами дедушек моего и жены. В ближайшем магазине фототоваров (Фотопроект) набор для создания транспаранта - рамка формата А4 и флагшток с креплениями (отрезок пластиковой водопроводной трубы с зажимами для крепления к к стене).

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

Рамка. Вид спереди:


Вид сзади:



Этикетки, если вдруг кому важно:





Вид сзади без упаковки:

Итак. рамка штатных подвесов к трубе не имеет. Разбираем рамку:
На задней стенке 4 зажима для ее крепления к телу рамки. Зажимы на заклепках. Вид с другой стороны:

Заклепка ближе:
  
Сам зажим:

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

 Пальцем поддавливаем заклепку с другой стороны, чтобы она не убегала, и плоскогубцами сжимает ее по возможности равномерно со всех сторон. После этого плоскогубцами вытаскиваем ее. Материал задней стенки не повреждается. Отделенный зажим с заклепкой:
То же проделываем с другой заклепкой:
Развальцовываем отверстие (несильно), чтобы головка винта лучше утопилась в материал:
Получается как-то так:
Закручиваем в отверстие винт четверку:
Одеваем шайбу. Снимать штатный подвес рамки под саморез я не стал, чтобы не портить внешний вид задней стенки:

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

 
 В него загоняем гайку. Для этого накладываем ее на отверстие
 И вдавливаем плоскогубцами
Получится вот так:
 Теперь накручиваем крепление на винт. Гайка еще утопится в крепление по мере закручивания. Сам винт крутить не надо. Можно его придерживать отверткой,чтобы не прокручивался (у меня такого не было). Крутим само крепление. Результат:
 
 С другим креплением поступаем аналогично:
Теперь вкладываем в основу рамки стекло и изображение. Между изображением и задней стенкой я проложил вкладыш, шедший с рамкой в качестве пример рисунка. Он  сделан из плотной бумаги и защитит изображение от порчи винтами:
 Ставим заднюю стенку. За счет того, что была поставлена промежуточная гайка вертикальные зажимы очень туго вращаются. Это защитит нашу тяжелую рамку от распада в неподходящий момент:
 Вставляем трубу:
 Почти всё:
 С одном транспарантом у меня проблем не возникло. А вот второй скользил по трубе. Поэтому я поставил хомуты по обе стороны креплений. В рабочем положении зажимы хомутов буду смотреть вовнутрь и не будут портить вид и цепляться. Сделал такое дополнительное крепление для обоих транспарантов:
 Итого: