Установка и настройка NextCloud на AlmaLinux 9
После установки на сервер AlmaLinux 9 (Minimal) (x86_64) 4Gb RAM, 4 CPU, 200Gb SSD, приступаем к подготовке сервера.
Подготовка сервера
1. Системные требования
С актуальными системными требованиями можно ознакомиться на сайте разработчика в разделе Administration Manual - Installation and server configuration - System requirements. Необходимо убедиться, что наш сервер соответствует данным требованиям.
dnf update -y dnf upgrade -y
2. Правильное время.
Устанавливаем утилиту chrony и nano:
dnf install nano chrony -y
Запускаем ее службу:
systemctl enable chronyd --now
Выставляем нужный часовой пояс:
timedatectl set-timezone Europe/Moscow
3. Настройка брандмауэра.
firewall-cmd --permanent --add-port={80,443}/tcp firewall-cmd --reload
4. Отключение SELinux.
setenforce 0 sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
Установка и настройка веб-сервера
PHP версии 8.3
На момент написания этой статьи версией PHP по умолчанию на AlmaLinux 9 является PHP 8.0. Согласно системным требованиям Nexcloud по адресу https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html мы собираемся установить PHP 8.3 и использовать его для установки Nextcloud.
dnf -y install https://rpms.remirepo.net/enterprise/remi-release-9.3.rpm dnf update
После обновления мы сможем проверить все доступные версии PHP для установки на наш сервер AlmaLinux после установки репозитория Remi.
dnf module list php
Вы увидите примерно такой вывод:
[root@rh ~]$# dnf module list php Last metadata expiration check: 0:00:17 ago on Wed 19 Jun 2024 03:51:07 AM CDT. AlmaLinux 9 - AppStream Name Stream Profiles Summary php 8.1 common [d], devel, minimal PHP scripting language php 8.2 common [d], devel, minimal PHP scripting language Remi's Modular repository for Enterprise Linux 9 - x86_64 Name Stream Profiles Summary php remi-7.4 common [d], devel, minimal PHP scripting language php remi-8.0 common [d], devel, minimal PHP scripting language php remi-8.1 common [d], devel, minimal PHP scripting language php remi-8.2 common [d], devel, minimal PHP scripting language php remi-8.3 common [d], devel, minimal PHP scripting language
Как видно выше, теперь мы можем установить PHP 8.3.
Чтобы включить источник по умолчанию для установки этого пакета скриптов на нашей машине AlmaLinux, нам нужно сначала сбросить его настройки, а затем указать желаемую версию для включения.
dnf module reset php dnf module enable php:remi-8.3
Вот и все, мы перешли на PHP 8.3. Теперь, чтобы установить PHP 8.3 с необходимыми расширениями, мы можем выполнить эту команду ниже:
dnf install php php-{bz2,ctype,curl,fpm,gd,imagick,intl,json,fileinfo,libxml,mbstring,mysqlnd,openssl,posix,session,simplexml,xmlreader,xmlwriter,zip,zlib}
После завершения установки служба PHP-FPM будет запущена, но не будет включена после перезагрузки сервера. Вы можете проверить и подтвердить установленную версию PHP с помощью этой команды.
php -v
Он вернет такой вывод:
[root@almalinux8 ~]# php -v PHP 8.3.8 (cli) (built: Jun 4 2024 14:53:17) (NTS gcc x86_64) Copyright (c) The PHP Group Zend Engine v4.3.8, Copyright (c) Zend Technologies with Zend OPcache v8.3.8, Copyright (c), by Zend Technologies
Настройка PHP-FPM
На машине Almalinux, ‘user’ и ‘group’ в /etc/php-fpm.d/www.conf по умолчанию являются ‘apache.’ Поскольку мы будем использовать nginx в качестве веб-сервера, нам нужно отредактировать файл конфигурации.
nano /etc/php-fpm.d/www.conf
Измените ‘user’ и ‘group’ на ‘nginx’.
... user = nginx group = nginx ...
Сохраните файл, затем выйдите. После этого мы отредактируем некоторые значения PHP, необходимые для установки Nextcloud.
nano /etc/php.ini
Раскомментируйте и измените значения конфигурации, как показано ниже.
... memory_limit = 1024M date.timezone = "Europe/Moscow" cgi.fixpathinfo = 0 ...
Нам также необходимо изменить разрешения сеанса PHP и каталогов OpCache.
chown -R root.nginx /var/lib/php/opcache/ chown -R root.nginx /var/lib/php/session/
Затем перезапустим PHP-FPM и включим его после перезагрузки.
systemctl restart php-fpm systemctl enable php-fpm
Установка и настройка NGINX
После настройки PHP-FPM мы установим и настроим nginx как веб-сервер, а не Apache. Выполните эту команду, чтобы установить его.
dnf install nginx -y
Запустите nginx и включите его при загрузке.
systemctl enable --now nginx
Давайте создадим блок сервера nginx.
nano /etc/nginx/conf.d/cloud.putyato.ru.conf
Вставьте следующее и обязательно замените cloud.putyato.ru на свое фактическое имя домена или поддомена:
upstream php-handler { server unix:/run/php-fpm/www.sock; } # Set the `immutable` cache control options only for assets with a cache busting `v` argument map $arg_v $asset_immutable { "" ""; default "immutable"; } server { listen 80; server_name cloud.putyato.ru; # Path to the root of your installation root /var/www/nextcloud; # Prevent nginx HTTP Server Detection server_tokens off; # set max upload size and increase upload timeout: client_max_body_size 512M; client_body_timeout 300s; fastcgi_buffers 64 4K; # Enable gzip but do not remove ETag headers gzip on; gzip_vary on; gzip_comp_level 4; gzip_min_length 256; gzip_proxied expired no-cache no-store private no_last_modified no_etag auth; gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/wasm application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy; # HTTP response headers borrowed from Nextcloud `.htaccess` add_header Referrer-Policy "no-referrer" always; add_header X-Content-Type-Options "nosniff" always; add_header X-Download-Options "noopen" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Permitted-Cross-Domain-Policies "none" always; add_header X-Robots-Tag "none" always; add_header X-XSS-Protection "1; mode=block" always; # Remove X-Powered-By, which is an information leak fastcgi_hide_header X-Powered-By; index index.php index.html /index.php$request_uri; # Rule borrowed from `.htaccess` to handle Microsoft DAV clients location = / { if ( $http_user_agent ~ ^DavClnt ) { return 302 /remote.php/webdav/$is_args$args; } } location = /robots.txt { allow all; log_not_found off; access_log off; } # Make a regex exception for `/.well-known` so that clients can still # access it despite the existence of the regex rule # `location ~ /(\.|autotest|...)` which would otherwise handle requests # for `/.well-known`. location ^~ /.well-known { # The rules in this block are an adaptation of the rules # in `.htaccess` that concern `/.well-known`. location = /.well-known/carddav { return 301 /remote.php/dav/; } location = /.well-known/caldav { return 301 /remote.php/dav/; } location /.well-known/acme-challenge { try_files $uri $uri/ =404; } location /.well-known/pki-validation { try_files $uri $uri/ =404; } # Let Nextcloud's API for `/.well-known` URIs handle all other # requests by passing them to the front-end controller. return 301 /index.php$request_uri; } # Rules borrowed from `.htaccess` to hide certain paths from clients location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/) { return 404; } location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) { return 404; } # Ensure this block, which passes PHP files to the PHP process, is above the blocks # which handle static assets (as seen below). If this block is not declared first, # then Nginx will encounter an infinite rewriting loop when it prepends `/index.php` # to the URI, resulting in a HTTP 500 error response. location ~ \.php(?:$|/) { # Required for legacy support rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy) /index.php$request_uri; fastcgi_split_path_info ^(.+?\.php)(/.*)$; set $path_info $fastcgi_path_info; try_files $fastcgi_script_name =404; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $path_info; fastcgi_param HTTPS on; fastcgi_param modHeadersAvailable true; # Avoid sending the security headers twice fastcgi_param front_controller_active true; # Enable pretty urls fastcgi_pass php-handler; fastcgi_intercept_errors on; fastcgi_request_buffering off; fastcgi_max_temp_file_size 0; } location ~ \.(?:css|js|svg|gif|png|jpg|ico|wasm|tflite|map)$ { try_files $uri /index.php$request_uri; add_header Cache-Control "public, max-age=15778463, $asset_immutable"; access_log off; # Optional: Don't log access to assets location ~ \.wasm$ { default_type application/wasm; } } location ~ \.woff2?$ { try_files $uri /index.php$request_uri; expires 7d; # Cache-Control policy borrowed from `.htaccess` access_log off; # Optional: Don't log access to assets } # Rule borrowed from `.htaccess` location /remote { return 301 /remote.php$request_uri; } location / { try_files $uri $uri/ /index.php$request_uri; } }
Сохраните файл, затем выйдите и перезапустите nginx.
systemctl restart nginx
Установка сервера MySQL
Nextcloud поддерживает несколько баз данных, таких как PostgreSQL, Oracle, SQLite и MySQL/MariaDB. В этом руководстве мы будем использовать MySQL 8.0. Давайте сначала установим его, вызвав команду ниже.
dnf install mysql mysql-server systemctl enable --now mysqld
Сервер MySQL теперь запущен и будет автоматически запущен после перезагрузки. Вы можете проверить статус, выполнив эту команду:
systemctl status mysqld
Команда вернет следующий вывод:
[root@almalinux9 ~]$# systemctl status mysqld ● mysqld.service - MySQL 8.0 database server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; preset: disabled) Active: active (running) since Wed 2024-06-19 03:26:55 CDT; 1min 41s ago Process: 4912 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS) Process: 4934 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS) Main PID: 5009 (mysqld) Status: "Server is operational" Tasks: 37 (limit: 23191) Memory: 459.9M CPU: 9.713s CGroup: /system.slice/mysqld.service └─5009 /usr/libexec/mysqld --basedir=/usr Jun 19 03:26:41 almalinux9.rosehosting.com systemd[1]: Starting MySQL 8.0 database server... Jun 19 03:26:41 almalinux9.rosehosting.com mysql-prepare-db-dir[4934]: Initializing MySQL database Jun 19 03:26:55 almalinux9.rosehosting.com systemd[1]: Started MySQL 8.0 database server.
Создание базы данных
После установки сервера MySQL на предыдущем шаге мы можем приступить к созданию новой базы данных и пользователя для нашего веб-сайта Nextcloud.
mysql
В оболочке MySQL выполните следующие команды.
mysql> CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; mysql> CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY "nextcloud"; mysql> GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost'; mysql> FLUSH PRIVILEGES; mysql> \q
Не забудьте заменить « nextcloud » на более надежный пароль.
Установка SSL-сертификата
Мы установим SSL-сертификат для нашего сайта Nextcloud, используя бесплатный SSL-сертификат от Lets Encrypt.
dnf install certbot python3-certbot-nginx -y
После установки вы можете запустить эту команду для выпуска SSL-сертификата. Опять же, не забудьте заменить поддомен на ваше фактическое имя домена или поддомена; оно должно совпадать с именем в файле конфигурации блока сервера nginx, который мы создали ранее. Также убедитесь, что домен или поддомен уже указывает на IP-адрес вашего сервера.
certbot --nginx -d cloud.putyato.ru
Обязательно ответьте на вопросы, и вы увидите примерно такой вывод:
[root@rh ~]$# certbot --nginx -d cloud.putyato.ru Saving debug log to /var/log/letsencrypt/letsencrypt.log Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): admin@putyato.ru - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.4-April-3-2024.pdf. You must agree in order to register with the ACME server. Do you agree? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: Y - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Would you be willing, once your first certificate is successfully issued, to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: N Account registered. Requesting a certificate for cloud.putyato.ru Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/cloud.putyato.ru/fullchain.pem Key is saved at: /etc/letsencrypt/live/cloud.putyato.ru/privkey.pem This certificate expires on 2024-09-17. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. Deploying certificate Successfully deployed certificate for cloud.putyato.ru to /etc/nginx/conf.d/nexcloud.conf Congratulations! You have successfully enabled HTTPS on https://cloud.example.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If you like Certbot, please consider supporting our work by: * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate * Donating to EFF: https://eff.org/donate-le - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Теперь перезапустим nginx.
systemctl restart nginx
Установка Nextcloud
Наконец, мы можем приступить к установке Nextcloud. Сначала нам нужно скачать файл архива установки. Перейдите на страницу загрузки Nextcloud и выберите нужную вам версию.
Для этого примера мы загрузим последнюю доступную версию. Давайте выполним эту команду:
wget https://download.nextcloud.com/server/releases/latest.zip -O latest.zip
Затем извлеките загруженный zip-архив в корневой каталог документов на вашем сервере.
unzip latest.zip -d /var/www/ mkdir /var/www/nextcloud/data chown -R nginx: /var/www/nextcloud
После извлечения вы можете приступить к установке Nextcloud через веб-установщик по адресу http://cloud.yourdomain.com, щелкните вкладку MySQL/MariaDB, затем заполните поля по мере необходимости, затем нажмите кнопку «Установить», чтобы завершить установку.
Переключаемся на MySQL/MariaDB, вводим в качестве логина, пароля и базы : nextcloud
Завершаем установку, при желании, оставим галочку для установки рекомендованных приложений:
После установки мы окажемся в системе.
Проверка безопасности и параметров
Для корректной работы системы выполним дополнительную настройку системы. После входа в nextcloud под администратором, переходим в настройки для пользователя:
В разделе «Параметры сервера» переходим в Основные сведения:
В разделе «Проверка безопасности и параметров» мы можем увидеть список проблем. Рассмотрим процесс решения некоторых из них.
1. PHP не настроен правильно для получения переменных системного окружения
Открываем файл php.ini. При нашей установке, это:
nano /etc/php-fpm.d/www.conf
Снимаем комментарий с параметра PATH:
env[PATH] = /usr/local/bin:/usr/bin:/bin
Перезапускаем php-fpm:
systemctl restart php-fpm
2. Разрешённое максимальное значение использования памяти PHP ниже рекомендуемого значения в 512 МБ
Открываем на редактирование файл:
nano /etc/php.ini
Меняем настройку для memory_limit:
memory_limit = 512M
Перезапускаем php-fpm:
systemctl restart php-fpm
3. В базе данных отсутствуют некоторые индексы
Выполним команду для индексирования баз:
sudo -u apache php /var/www/nextcloud/occ db:add-missing-indices
4. Некоторые индексы базы данных не были преобразованы в тип big int
Выполним команду для преобразования в тип big int:
sudo -u apache php /var/www/nextcloud/occ db:convert-filecache-bigint
На запрос Continue with the conversion отвечаем утвердительно:
Continue with the conversion (y/n)? [n] y
5. Настраиваем модуль OPcache
Открываем конфигурационный файл:
nano /etc/php.d/10-opcache.ini
Редактируем следующее:
... opcache.enable=1 ... opcache.enable_cli=1 ... opcache.interned_strings_buffer=32 ... opcache.max_accelerated_files=10000 ... opcache.memory_consumption=256 ... opcache.save_comments=1 ... opcache.revalidate_freq=1 ...
Перезапускаем php-fpm:
systemctl restart php-fpm
6. MySQL используется в качестве базы данных, но не поддерживает 4-байтовые символы
Выполняем конфигурирование в несколько этапов.
Настройка СУБД Заходим в оболочку mysql:
mysql -uroot -p
Смотрим значение для переменной innodb_file_format:
> show variables like 'innodb_file_format';
Если видим значение «Antelope», меняем его на Barracuda:
> SET GLOBAL innodb_file_format=Barracuda; > quit
Настройка Nextcloud Переводим Nextcloud в режим обслуживания:
sudo -u apache php /var/www/nextcloud/occ maintenance:mode --on
Перезагружаем mariadb (если на первом шаге нам пришлось менять значение для переменной innodb_file_format):
systemctl restart mariadb
Редактирование базы данных Снова подключаемся к консоли управления СУБД:
mysql -uroot -p
Меняем кодировку для базы данных:
> ALTER DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
- где nextcloud — имя созданной нами базы данных.
Выходим из mariadb:
> quit
Также задаем новую кодировку для nextcloud
sudo -u apache php /var/www/nextcloud/occ config:system:set mysql.utf8mb4 --type boolean --value="true"
Преобразуем все таблицы в базе:
sudo -u apache php /var/www/nextcloud/occ maintenance:repair
Завершаем режим обслуживания:
sudo -u apache php /var/www/nextcloud/occ maintenance:mode --off
7. Чтобы поменять PHP8.2 на PHP8.3 и более старшую версию.
PHP 8.3 недоступен в репозиториях по умолчанию, необходимых для установки репозитория Remi:
Проверяем имеется ли нужная версия по ссылки: dnf install http://rpms.remirepo.net/enterprise
Устанавливаем нужный репозиторий (в нашем случае):
dnf install http://rpms.remirepo.net/enterprise/remi-release-8.rpm
После этого теперь вы можете сбросить модуль и включить PHP 8.3 и перезаписать модули еже новой версии:
dnf module reset php dnf module install php:remi-8.3 --allowerasing
Проверяем версию PHP:
php -v
8. Не настроена система кеширования. Для увеличения производительности сервера, по возможности, настройте //memcache//.
Устанавливаем нужные библиотеки.
dnf install php-memcached memcached php-pecl-memcached -y
После разрешаем автозапуск и запускаем сервис кэширования:
systemctl enable memcached --now systemctl restart php-fpm
Проверяем запустился ли memcached.
ps ax | grep memcached
Должны увидеть:
[root@cloud ~]# ps ax | grep memcached 65140 ? Ssl 0:00 /usr/bin/memcached -p 11211 -u memcached -m 64 -c 1024 -l 127.0.0.1,::1 65169 pts/0 S+ 0:00 grep --color=auto memcached
Теперь в конфиге NextCloud по пути: /var/www/nextcloud/config/config.php добавим строки:
nano /var/www/nextcloud/config/config.php
'memcache.local' => '\OC\Memcache\Memcached', 'memcache.distributed' => '\OC\Memcache\Memcached', 'memcached_servers' => [ [ '127.0.0.1', 11211 ], ],
Перезапускаем сервер:
reboot
9. База данных используется для блокировки транзакционных файлов. Для повышения производительности, пожалуйста, настройте //memcache//, если таковой имеется.
Чтобы использовать кэш памяти с транзакционной блокировкой файлов, необходимо установить сервер Redis и соответствующий модуль PHP.
Включите репозиторий:
dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm -y
Перечислите все доступные пакеты Redis в репозитории Remi.
dnf module list | grep redis
Смотрим последнюю версию, она на сегодня 7.2
Предварительно может понадобиться сброс модуля редис
dnf module reset redis
Предполагая, что последняя основная версия - 7.2, установите эту версию:
dnf module install redis:remi-7.2 -y
Включите службу Redis для запуска во время загрузки и запускаем сам Redis.
systemctl enable redis.service systemctl start redis.service
Настройка Redis
Откройте файл конфигурации Redis :
nano /etc/redis.conf
Вписываем туда:
maxmemory 128mb maxmemory-policy allkeys-lru save 900 1 save 300 10 save 60 10000
Сохраните и закройте конфигурационный файл, затем перезапустите Redis, чтобы применить изменения.
systemctl restart redis.service
Проверяем запустился ли Redis
ps ax | grep redis
должны увидеть
[root@cloud ~]# ps ax | grep redis 1319 ? Ssl 0:01 /usr/bin/redis-server 127.0.0.1:6379 1786 pts/0 S+ 0:00 grep --color=auto redis
Теперь в конфиге NextCloud по пути: /var/www/nextcloud/config/config.php добавим строки:
nano /var/www/nextcloud/config/config.php
'filelocking.enabled' => true, 'memcache.locking' => '\OC\Memcache\Redis', 'redis' => array( 'host' => 'localhost', 'port' => 6379, 'timeout' => 0.0, 'password' => '', // Optional, if not defined no password will be used. ),
Перезапускаем сервер:
reboot
10. Не указан регион размещения этого сервера Nextcloud
Для устранения данного предупреждения откроем конфигурационный файл NextCloud :
nano /var/www/nextcloud/config/config.php
и добавляем туда
'default_phone_region' => 'RU',
Установка и настройка клиента
Для синхронизации файлов установим и настроим клиента. Nextcloud поддерживает установку на Windows, Linux, Mac, iOS и Android.
Переходим на страницу загрузки Nextcloud и скачиваем нужный клиент. После устанавливаем его, отвечая на все вопросы мастера по умолчанию. Для установки клиента на телефон, пользуемся Google Play или Apple App Store.
Запускаем клиентское приложение и переходим к настройке, кликнув по Войти:
На следующей странице вводим адрес нашего сервера и кликаем по Далее:
Нас перекинет на веб страницу для авторизации — вводим логин и пароль для пользователя. После успешной авторизации можно использовать клиент для синхронизации с файлов с нашим облаком.