Т.к. уже доступен релиз 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.
после изучения данного вопроса, вышел на документацию, что нужно использовать 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:
Авторизуюсь:
Имя пользователя / email: ввожу ekzorchik
Пароль: ввожу 712mbddr@
и нажимаю "Логин"
. Итого я успешно авторизован в развернутом сервисе:
Шаг №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.