Т.к. уже доступен релиз Ubuntu 22.04 то мне снова нужно переводить к единому стилю все развернутые домашние сервисы применительно к этой системе. Начну я перво-наперво с сервиса, организующего мое "Облачное хранилище", которое развернуто на домашнем сервере и служит для обмена наработками, схемами, таблицами между моими устройствами: Ноутбук, Компьютер, Смартфон, Планшет. Сервис вместо Dropbox на подконтрольном железе, а Администратор всего этого — я сам.

В качестве Web-сервиса буду использовать Nginx

Шаг №1: Обновляем информацию о репозитариях, обновляем установленные пакеты и систему в рамках текущего долговременного релиза:

ekzorchik@srv-us2204a:~$ sudo rm -Rf /var/lib/apt/lists
ekzorchik@srv-us2204a:~$ cat /etc/update-manager/release-upgrades | grep Prompt
Prompt=lts
ekzorchik@srv-us2204a:~$
ekzorchik@srv-us2204a:~$ sudo sed -i '/Prompt/s/lts/never/' /etc/update-manager/release-upgrades
ekzorchik@srv-us2204a:~$ cat /etc/update-manager/release-upgrades | grep Prompt
Prompt=never
ekzorchik@srv-us2204a:~$ sudo apt-get update && sudo apt-get upgrade -y && sudo apt dist-upgrade -y

Шаг №2: Устанавливаю приложения которые хочу иметь текущей системы (у каждого уважающего себя системного администратора — он обычно свой):

ekzorchik@srv-us2204a:~$ sudo apt-get install -y mercurial unzip net-tools

Шаг №3: Настраиваю локаль:

ekzorchik@srv-us2204a:~$ hg clone http://ekzorchik:712mbddr@@172.35.35.8/hg/dproject
destination directory: dproject
requesting all changes
adding changesets
adding manifests
adding file changes
added 3 changesets with 4 changes to 3 files
new changesets 25066b9f886f:6abb0ff588c5
updating to branch default
3 files updated, 0 files merged, 0 files removed, 0 files unresolved
ekzorchik@srv-us2204a:~$
ekzorchik@srv-us2204a:~$ sudo ./dproject/locale.sh
ekzorchik@srv-us2204a:~$ locale
LANG=en_US.UTF-8
LANGUAGE=en.US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
ekzorchik@srv-us2204a:~$

либо вручную:

ekzorchik@srv-us2204a:~$ sudo rm -f /etc/localtime
ekzorchik@srv-us2204a:~$ sudo ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime
ekzorchik@srv-us2204a:~$ sudo locale-gen en_US.UTF-8
Generating locales (this might take a while)...
  en_US.UTF-8... done
Generation complete.
ekzorchik@srv-us2204a:~$
ekzorchik@srv-us2204a:~$ echo "LC_ALL="en_US.UTF-8"" | sudo -s tee /etc/default/locale
LC_ALL=en_US.UTF-8
ekzorchik@srv-us2204a:~$ echo "LANG="en_US.UTF-8"" | sudo tee -a /etc/default/locale
LANG=en_US.UTF-8
ekzorchik@srv-us2204a:~$ echo "LANGUAGE="en.US.UTF-8"" | sudo tee -a /etc/default/locale
LANGUAGE=en.US.UTF-8
ekzorchik@srv-us2204a:~$
ekzorchik@srv-us2204a:~$ locale
LANG=en_US.UTF-8
LANGUAGE=en.US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
ekzorchik@srv-us2204a:~$

Шаг №4: Устанавливаю Webсервис Nginx:

ekzorchik@srv-us2204a:~$ sudo apt-get install -y nginx
ekzorchik@srv-us2204a:~$ sudo rm -f /var/www/html/index.nginx-debian.html
ekzorchik@srv-us2204a:~$ sudo unlink /etc/nginx/sites-enabled/default
ekzorchik@srv-us2204a:~$ sudo rm -f /etc/nginx/sites-available/default

Шаг №5: Создаю самоподписанный сертификат сервера дабы взаимодействие с сервисом OwnCloud велось не через http, а исключительно через https:

ekzorchik@srv-us2204a:~$ sudo mkdir -p /etc/ssl/nginx
ekzorchik@srv-us2204a:~$ sudo openssl dhparam -out /etc/ssl/nginx/dh2048.pem 2048
ekzorchik@srv-us2204a:~$ sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/nginx/srv-us2204a.key -out /etc/ssl/nginx/srv-us2204a.crt
...............+.+.....+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.......+.....+.+...........+.+..+...+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+..+....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
...+...............+....+.....+...+..........+............+...+.....+.+............+.....+...+.......+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.....+.........+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+.....+.+.........+......+...+..+...+.+..............+......+............+...+.......+........................+.....+......+....+......+..+.+.....+......+...+.......+......+............+.....+......+.+...+........+.........+.+.......................+.+...........+............+.+............+........+.+...+..................+..............+......+.............+..+...+.+.........+.........+.................+....+..+.......+...+........+.+.........+..+...+......+...+...+.............+..+...+.+........+......+.........+......+.+.....+.+..+...............+...+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----
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]:RUSSIAN
Locality Name (eg, city) []:Moscow
Organization Name (eg, company) [Internet Widgits Pty Ltd]:ekzorchik
Organizational Unit Name (eg, section) []:ekzorchik
Common Name (e.g. server FQDN or YOUR name) []:172.35.35.7
Email Address []:support@ekzorchik.ru
ekzorchik@srv-us2204a:~$
ekzorchik@srv-us2204a:~$ ls -l /etc/ssl/nginx/
total 12
-rw-r--r-- 1 root root  424 Dec  8 08:43 dh2048.pem
-rw-r--r-- 1 root root 1460 Dec  8 08:47 srv-us2204a.crt
-rw------- 1 root root 1704 Dec  8 08:46 srv-us2204a.key
ekzorchik@srv-us2204a:~$

Шаг №6: Устанавливаю интерпретатор php скриптов:

ekzorchik@srv-us2204a:~$ sudo apt-get install -y php-fpm php-common php-mbstring php-xmlrpc php-soap php-gd php-xml php-intl php-mysql php-cli php-zip php-curl

Шаг №7: Вношу изменения в конфигурационные файлы по части работы интерпретатора php:

ekzorchik@srv-us2204a:~$ sudo nano /etc/php/8.1/fpm/php.ini
;cgi.fix_pathinfo=1
cgi.fix_pathinfo=0
;max_execution_time = 30
max_execution_time = 180
;upload_max_filesize = 2M
upload_max_filesize = 64M
ekzorchik@srv-us2204a:~$ sudo nano /etc/php/8.1/fpm/pool.d/www.conf
;security.limit_extensions = .php .php3 .php4 .php5 .php7
security.limit_extensions = .php .php3 .php4 .php5 .php7
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

Шаг №8: Устанавливаю сервис базы данных:

ekzorchik@srv-us2204a:~$ sudo apt-get install -y mysql-server mysql-client

Шаг №9: Изменяю схему авторизации и назначаю пароль на системную учетной запись root сервиса MySQL:

ekzorchik@srv-us2204a:~$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
default-authentication-plugin=mysql_native_password
ekzorchik@srv-us2204a:~$ sudo mysql -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '712mbddr@';"

Шаг №10: Создаю базу данных, пользователя и пароль под эту базу данных:

ekzorchik@srv-us2204a:~$ sudo mysql -u root -p712mbddr@ -e "create database db_owncloud character set utf8"
mysql: [Warning] Using a password on the command line interface can be insecure.
ekzorchik@srv-us2204a:~$ sudo mysql -u root -p712mbddr@ -e "create user 'us_own'@'localhost' identified by '612mbddr@'"
mysql: [Warning] Using a password on the command line interface can be insecure.
ekzorchik@srv-us2204a:~$ sudo mysql -u root -p712mbddr@ -e "grant all on db_owncloud.* to 'us_own'@'localhost';"
mysql: [Warning] Using a password on the command line interface can be insecure.
ekzorchik@srv-us2204a:~$

Шаг №11: Скачиваю/распаковываю и размещаю в дефолтном каталоге Webсервиса Nginx пакет Owncloud чтобы развернуть на текущей системе:

ekzorchik@srv-us2204a:~$ wget https://download.owncloud.com/server/stable/owncloud-complete-latest.tar.bz2
ekzorchik@srv-us2204a:~$ file owncloud-complete-latest.tar.bz2
owncloud-complete-latest.tar.bz2: bzip2 compressed data, block size = 900k
ekzorchik@srv-us2204a:~$ bzip2 -d owncloud-complete-latest.tar.bz2
ekzorchik@srv-us2204a:~$ tar xf owncloud-complete-latest.tar
ekzorchik@srv-us2204a:~$ sudo mv ~/owncloud /var/www/html/

Шаг №12: Создаю конфигурацию сайта для Webсервиса Nginx чтобы при обращении на адрес текущей системы у меня открывалось окно доступа в Owncloud:

ekzorchik@srv-us2204a:~$ sudo nano /etc/nginx/sites-available/owncloud.conf
upstream php-handler {
      server unix:/var/run/php/php8.1-fpm.sock;
}

server {
     listen 80;
     server_name 172.35.35.7;


      location / {
          return 301 https://$server_name$request_uri;
      }
}

server {
        listen 443 ssl http2;
        server_name 172.35.35.7;

        ssl_certificate /etc/ssl/nginx/srv-us2204a.crt;
        ssl_certificate_key /etc/ssl/nginx/srv-us2204a.key;

        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";

        ssl_prefer_server_ciphers on;
        ssl_ecdh_curve secp384r1;
        ssl_session_cache shared:SSL:10m;
        ssl_session_tickets off;
        ssl_stapling_verify on;
        resolver 8.8.8.8 8.8.4.4 valid=300s;
        resolver_timeout 5s;


        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;

        add_header X-Frame-Options "SAMEORIGIN";

        ssl_dhparam /etc/ssl/nginx/dh2048.pem;


        keepalive_timeout    70;

        add_header X-Content-Type-Options nosniff;
        add_header X-Frame-Options "SAMEORIGIN";
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;

        root /var/www/html/owncloud/;

        location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }


      location = /.well-known/carddav {
          return 301 $scheme://$host/remote.php/dav;
      }
      location = /.well-known/caldav {
          return 301 $scheme://$host/remote.php/dav;
      }

      client_max_body_size 512M;
      gzip off;

        error_page 403 /core/templates/403.php;
        error_page 404 /core/templates/404.php;

      location / {
          rewrite ^ /index.php$uri;
      }

      location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
          return 404;
      }
      location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
          return 404;
      }

      location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) {
          fastcgi_split_path_info ^(.+\.php)(/.*)$;
          include fastcgi_params;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          fastcgi_param PATH_INFO $fastcgi_path_info;
          fastcgi_param HTTPS on;
          fastcgi_param front_controller_active true;
          fastcgi_pass php-handler;
          fastcgi_intercept_errors on;
      }

      location ~ ^/(?:updater|ocs-provider)(?:$|/) {
          try_files $uri $uri/ =404;
          index index.php;
      }

      location ~ \.(?:css|js)$ {
          try_files $uri /index.php$uri$is_args$args;
          add_header Cache-Control "max-age=15778463";
          add_header X-Content-Type-Options nosniff;
          add_header X-Frame-Options "SAMEORIGIN";
          add_header X-XSS-Protection "1; mode=block";
          add_header X-Robots-Tag none;
          add_header X-Download-Options noopen;
          add_header X-Permitted-Cross-Domain-Policies none;
        access_log /var/log/nginx/access.log combined;
      }

      location ~ \.(?:svg|gif|png|html|ttf|woff|ico|jpg|jpeg|map)$ {
          add_header Cache-Control "public, max-age=7200";
          try_files $uri /index.php$uri$is_args$args;
          access_log off;
      }
  }
ekzorchik@srv-us2204a:~$ sudo ln -s /etc/nginx/sites-available/owncloud.conf /etc/nginx/sites-enabled/owncloud.conf
ekzorchik@srv-us2204a:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
ekzorchik@srv-us2204a:~$

Шаг №13: Выполняю настройку Owncloud, можно через Webинтерфейс, а можно через консоль:

ekzorchik@srv-us2204a:~$ sudo php /var/www/html/owncloud/occ maintenance:install --database mysql --database-name db_owncloud --database-host 127.0.0.1 --database-user us_own --database-pass 612mbddr@ --database-table-prefix bowndb_ --admin-user ekzorchik --admin-pass 712mbddr@ --data-dir /var/www/html/owncloud/data
This version of ownCloud is not compatible with PHP 8.0  - вот это я проглядел
You are currently running PHP 8.1.2-1ubuntu2.9.
ekzorchik@srv-us2204a:~$
ekzorchik@srv-us2204a:~$ sudo php /var/www/html/owncloud/occ config:system:set trusted_domains 1 --value=172.35.35.7
This version of ownCloud is not compatible with PHP 8.0 - вот это я проглядел
You are currently running PHP 8.1.2-1ubuntu2.9.
ekzorchik@srv-us2204a:~$
ekzorchik@srv-us2204a:~$ sudo chown -R www-data:www-data /var/www/html/owncloud/

Шаг №14: Перезапускаю Webсервис nginx и обработчик php скриптов:

ekzorchik@srv-us2204a:~$ sudo systemctl restart nginx php8.1-fpm

Шаг №15: Проверяю, что Webсервис nginx работает, ожидая подключение на порты 80 и 443:

ekzorchik@srv-us2204a:~$ sudo netstat -tulpn | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      18138/nginx: master
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      18138/nginx: master
ekzorchik@srv-us2204a:~$

Отлично.

Шаг №16: Открываю браузер и обращаюсь к URL адресу текущего сервера где у меня развернут сервис OwnCloud, т.е. URL: https://IP&DNS

вижу сообщение что "Подключение не защищено" — это нормально, т.к. сертификат самоподписанный

"Подключение не защищено" - самоподписанный сертификат

нажимаю "Дополнительные" - "Перейти на сайт 172.35.35.7 (небезопасно)"

This version of ownCloud is not compatible with PHP 8.0

You are currently running PHP 8.1.2-1ubuntu2.9.

Увы PHP 8 не работает с OwnCloud на Ubuntu 22.04 Server

после изучения данного вопроса, вышел на документацию, что нужно использовать php7.4 пакеты которых устанавливать из подключаемого репозитария: ondrej/php PPA

(https://doc.owncloud.com/server/next/admin_manual/installation/quick_guides/ubuntu_22_04.html)

ekzorchik@srv-us2204a:~$ sudo add-apt-repository ppa:ondrej/php
ekzorchik@srv-us2204a:~$ sudo apt-get remove --purge -y php-fpm php-common php-mbstring php-xmlrpc php-soap php-gd php-xml php-intl php-mysql php-cli php-zip php-curl
ekzorchik@srv-us2204a:~$ sudo apt-get install -y php7.4-fpm php7.4-common php7.4-mbstring php7.4-xmlrpc php7.4-soap php7.4-gd php7.4-xml php7.4-intl php7.4-mysql php7.4-cli php7.4-zip php7.4-curl php7.4-memcache php7.4-apcu
ekzorchik@srv-us2204a:~$ sudo mysql -u root -p712mbddr@ -e "drop database db_owncloud"
mysql: [Warning] Using a password on the command line interface can be insecure.
ekzorchik@srv-us2204a:~$ sudo mysql -u root -p712mbddr@ -e "create database db_owncloud character set utf8"
mysql: [Warning] Using a password on the command line interface can be insecure.
ekzorchik@srv-us2204a:~$ sudo mysql -u root -p712mbddr@ -e "grant all on db_owncloud.* to 'us_own'@'localhost';"
mysql: [Warning] Using a password on the command line interface can be insecure.
ekzorchik@srv-us2204a:~$
ekzorchik@srv-us2204a:~$ sudo nano /etc/php/7.4/fpm/php.ini
;cgi.fix_pathinfo=1
cgi.fix_pathinfo=0
;max_execution_time = 30
max_execution_time = 180
;upload_max_filesize = 2M
upload_max_filesize = 64M
;date.timezone =
date.timezone = Europe/Moscow
ekzorchik@srv-us2204a:~$ sudo nano /etc/php/7.4/fpm/pool.d/www.conf
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
и изменяю php8.1-fpm на php7.4-fpm в /etc/nginx/sites-enabled/owncloud.conf
ekzorchik@srv-us2204a:~$ sudo php /var/www/html/owncloud/occ maintenance:install --database mysql --database-name db_owncloud --database-host 127.0.0.1 --database-user us_own --database-pass 612mbddr@ --database-table-prefix bowndb_ --admin-user ekzorchik --admin-pass 712mbddr@ --data-dir /var/www/html/owncloud/data
ownCloud was successfully installed
ekzorchik@srv-us2204a:~$ sudo php /var/www/html/owncloud/occ config:system:set trusted_domains 1 --value=172.35.35.7
System config value trusted_domains => 1 set to string 172.35.35.7
ekzorchik@srv-us2204a:~$
ekzorchik@srv-us2204a:~$ sudo -u www-data /usr/bin/php /var/www/html/owncloud/occ config:system:set memcache.local --value '\OC\Memcache\APCu'
System config value memcache.local set to string \OC\Memcache\APCu
ekzorchik@srv-us2204a:~$
ekzorchik@srv-us2204a:~$ sudo -u www-data /usr/bin/php /var/www/html/owncloud/occ config:system:set memcache.locking --value '\OC\Memcache\Redis'
ekzorchik@srv-us2204a:~$ sudo -u www-data /usr/bin/php /var/www/html/owncloud/occ config:system:set redis --value '{"host": "127.0.0.1", "port": "6379"}' --type json
ekzorchik@srv-us2204a:~$ sudo systemctl restart nginx php7.4-fpm

Шаг №17: Для правильной работы сервиса OwnCloud нужно чтобы в планировщике системы были задания и был задействован cron «Мы рекомендуем включить системный cron, так как любой другой планировщик может иметь недоработки в производительности и надёжности.»

ekzorchik@srv-us2204a:~$ sudo -u www-data /usr/bin/php /var/www/html/owncloud/occ background:cron
Set mode for background jobs to 'cron'
ekzorchik@srv-us2204a:~$
ekzorchik@srv-us2204a:~$ echo "*/15 * * * * sudo -u www-data /usr/bin/php -f /var/www/owncloud/cron.php" | sudo tee  /var/spool/cron/crontabs/www-data
*/15 * * * * sudo -u www-data /usr/bin/php -f /var/www/owncloud/cron.php
ekzorchik@srv-us2204a:~$
ekzorchik@srv-us2204a:~$ echo "0  2  *  *  * sudo -u www-data /usr/bin/php /var/www/html/owncloud/occ dav:cleanup-chunks" | sudo tee -a /var/spool/cron/crontabs/www-data
0  2  *  *  * sudo -u www-data /usr/bin/php /var/www/html/owncloud/occ dav:cleanup-chunks
ekzorchik@srv-us2204a:~$
ekzorchik@srv-us2204a:~$ sudo chown -R www-data:www-data /var/www/html/owncloud/
ekzorchik@srv-us2204a:~$ sudo systemctl restart nginx php7.4-fpm

Шаг №18: Возвращаюсь к URL странице сервиса OwnCloud, но уже в качестве интерпретатора php скриптов используется версия 7.4:

Окно авторизации в Owncloud на Ubuntu 22.04 + PHP 7.4

Авторизуюсь:

  • Имя пользователя / email: ввожу ekzorchik
  • Пароль: ввожу 712mbddr@

и нажимаю "Логин". Итого я успешно авторизован в развернутом сервисе:

Owncloud успешно установлен на Ubuntu 22.04 Server

Шаг №19: Если Webсервис OwnCloud будет выставлен наружу, то нужно запретить поисковым роботам индексировать его:

ekzorchik@srv-us2204a:~$ sudo tee /var/www/html/owncloud/robots.txt << EOF
> User-agent: *
> Disallow: /
> EOF
User-agent: *
Disallow: /
ekzorchik@srv-us2204a:~$

Подводим итог, считаю, что свои наработки не стоит выносить на облачные сервисы, лучше, чтобы все было свое: железно, интернет, сервис, данные, бекапы, сертификат, доступы. Но есть и минус у всего этого — это Ваша квалификация, у меня она есть, если Вам нужна поддержка, то готов взять эту роль на себя. Я с данным сервисом "OwnCloud" в продуктиве начиная с 6 версии и все не нарадуюсь.

На этом я прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.