Nextcloud — это open-source-решение для синхронизации и обмена файлами, которое можно развернуть на собственном сервере. Оно служит полноценной альтернативой таким сервисам, как Google Drive, Dropbox и OwnCloud, предлагая даже больше возможностей.

Зачем устанавливать Nextcloud на МСВСфера 9/AlmaLinux 9/RockyLinux 9?

  1. Полный контроль над данными (все файлы хранятся на вашем сервере).
  2. Высокая безопасность (поддержка шифрования, 2FA, аудит доступа).
  3. Гибкость (можно расширять функционал плагинами).
  4. Бесплатно и открытый код (не нужно платить за подписки).

Требования для установки Nextcloud на МСВСфера 9/AlmaLinux 9/RockyLinux 9

Сервер с МСВСфера 9 (VPS или выделенный), желательно чистый и с достаточно большим диском, чтоб 80 и возможно 443 порт не были заняты. Доступ по SSH с правами sudo или root.

В данной статье будет описана установка NextCloud в локальной сети на машине с адресом для примера: 192.168.2.35 без доступа извне, для примера, чтобы машины в локальной сети мели файлоообменник. В данной статье я не буду описывать как создать самоподписанный сертификат, т.к. рассчет идет на то, что информация передается внутри сети. Данный сервер можно будет подключить в качестве аккаунта в Gnome Online Accounts и получить доступ к файлам по WebDAV протоколу.

И так приступим к установке.

Установка

Шаг 1

Подключиться к машине по ssh.

Шаг 2

# dnf update -y

Шаг 3: Установка PHP 8.3

Nextcloud рекомендует PHP 8.3. Устанавливаем репозиторий Remi:

# dnf -y install https://rpms.remirepo.net/enterprise/remi-release-9.5.rpm
# dnf update -y

Проверка доступных версий PHP:

# dnf module list php

Выберите PHP 8.3:

# dnf module reset php
# dnf module enable php:remi-8.3
# dnf install -y php php-{fpm,bz2,curl,gd,intl,mbstring,mysqlnd,zip,opcache,apcu,gmp,process,posix,imagick}

Проверка версии PHP:

# php -v

Ожидаемый вывод:

PHP 8.3.8 (cli)

Шаг 4: Настройка PHP-FPM

Добавьте следующие настройки в /etc/php-fpm.d/www.conf:

[www]
user = nginx
group = nginx
listen = /run/php-fpm/www.sock
listen.acl_users = apache,nginx
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log
clear_env = no
env[PATH] = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path]    = /var/lib/php/session2
php_value[soap.wsdl_cache_dir]  = /var/lib/php/wsdlcache

Создадим каталог для сессий:

mkdir -p /var/lib/php/session2
chown root:nginx /var/lib/php/session2
chmod 775 /var/lib/php/session2

Добавим следующие настройки в /etc/php.ini

[PHP]
engine = On
short_open_tag = Off
precision = 14
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func =
serialize_precision = -1
disable_functions =
disable_classes =
zend.enable_gc = On
zend.exception_ignore_args = On
zend.exception_string_param_max_len = 0
expose_php = On
max_execution_time = 3600
max_input_time = 3600
memory_limit = 768M
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
display_startup_errors = Off
log_errors = On
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
variables_order = "GPCS"
request_order = "GP"
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 2G
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
default_charset = "UTF-8"
doc_root =
user_dir =
enable_dl = Off
file_uploads = On
upload_max_filesize = 2G
max_file_uploads = 20
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60

[CLI Server]
cli_server.color = On

[Date]
date.timezone = Europe/Moscow

[filter]

[iconv]

[imap]

[intl]

[sqlite3]

[Pcre]
pcre.jit=0

[Pdo]

[Pdo_mysql]
pdo_mysql.default_socket=

[Phar]

[mail function]
sendmail_path = /usr/sbin/sendmail -t -i
mail.add_x_header = Off
mail.mixed_lf_and_crlf = Off

[ODBC]
odbc.allow_persistent = On
odbc.check_persistent = On
odbc.max_persistent = -1
odbc.max_links = -1
odbc.defaultlrl = 4096
odbc.defaultbinmode = 1

[MySQLi]
mysqli.max_persistent = -1
mysqli.allow_persistent = On
mysqli.max_links = -1
mysqli.default_port = 3306
mysqli.default_socket =
mysqli.default_host =
mysqli.default_user =
mysqli.default_pw =

[mysqlnd]
mysqlnd.collect_statistics = On
mysqlnd.collect_memory_statistics = Off

[OCI8]

[PostgreSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0

[bcmath]
bcmath.scale = 0

[browscap]

[Session]
session.save_handler = files
session.save_path = "/var/lib/php/session2"
session.use_strict_mode = 0
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.cookie_samesite =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.referer_check =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.sid_length = 26
session.trans_sid_tags = "a=href,area=href,frame=src,form="
session.sid_bits_per_character = 5

[Assertion]
zend.assertions = -1

[mbstring]

[gd]

[exif]

[Tidy]
tidy.clean_output = Off

[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/tmp"
soap.wsdl_cache_ttl=86400
soap.wsdl_cache_limit = 5

[sysvshm]

[ldap]
ldap.max_links = -1

[dba]

[opcache]

[curl]

[openssl]

[ffi]

Шаг 4: Установка и настройка Nginx

# dnf install -y nginx

Создайте конфигурационный файл для Nextcloud (/etc/nginx/conf.d/nextcloud.conf):

map $arg_v $asset_immutable {
    "" "";
    default ", immutable";
}

server {
    listen 80;
    listen [::]:80;
    server_name _;
    server_tokens off;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    root /mnt/bigdata-vol/nextcloud;
    client_max_body_size 512M;
    client_body_timeout 300s;
    fastcgi_buffers 64 4K;
    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 text/javascript 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;

    client_body_buffer_size 512k;
    add_header Referrer-Policy                   "no-referrer"       always;
    add_header X-Content-Type-Options            "nosniff"           always;
    add_header X-Frame-Options                   "SAMEORIGIN"        always;
    add_header X-Permitted-Cross-Domain-Policies "none"              always;
    add_header X-Robots-Tag                      "noindex, nofollow" always;
    add_header X-XSS-Protection                  "1; mode=block"     always;

    fastcgi_hide_header X-Powered-By;

    include mime.types;
    types {
        text/javascript mjs;
        application/wasm wasm;
    }

    index index.php index.html /index.php$request_uri;
    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;
    }
    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/)  { return 404; }
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console)                { return 404; }
    location ~ \.php(?:$|/) {
        rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocs-provider\/.+|.+\/richdocumentscode(_arm64)?\/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-fpm;
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
        fastcgi_max_temp_file_size 0;
    }

    location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ {
        try_files $uri /index.php$request_uri;
        add_header Cache-Control                     "public, max-age=15778463$asset_immutable";
        add_header Referrer-Policy                   "no-referrer"       always;
        add_header X-Content-Type-Options            "nosniff"           always;
        add_header X-Frame-Options                   "SAMEORIGIN"        always;
        add_header X-Permitted-Cross-Domain-Policies "none"              always;
        add_header X-Robots-Tag                      "noindex, nofollow" always;
        add_header X-XSS-Protection                  "1; mode=block"     always;
        access_log off;     # Optional: Don't log access to assets
    }

    location ~ \.(otf|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
    }

    location /remote {
        return 301 /remote.php$request_uri;
    }

    location / {
        try_files $uri $uri/ /index.php$request_uri;
    }
}

Здесь хотелось бы добавить следующее, корневой кталаог, где будет раположен NextCloud и все его базы и файлы - /mnt/bigdata-vol/nextcloud. Права доступа должны быть следующие:

# ls -l /mnt/bigdata-vol/
drwxr-xr-x  16 nginx   nginx       4096 мая 11 21:33 nextcloud

т.е

chown nginx:nginx /mnt/bigdata-vol/nextcloud
chmod 755 /mnt/bigdata-vol/nextcloud

Так же нужно внести правки в файл /etc/nginx/conf.d/php-fpm.conf:

upstream php-fpm {
        server unix:/run/php-fpm/www.sock;
}

и в файле /etc/nginx/mginx.conf закомментировать строки:

#    server {
#        listen       80;
#        listen       [::]:80;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        error_page 404 /404.html;
#        location = /404.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#        location = /50x.html {
#        }
#    }

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2;
#        listen       [::]:443 ssl http2;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers PROFILE=SYSTEM;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

Чтоб сайтом по умолчанию стал сайт nextcloud.

Шаг 5: Установка MySQL/MariaDB

# dnf install -y mariadb-server mariadb
# systemctl enable --now mariadb
# mysql_secure_installation

Создайте базу данных для Nextcloud:

CREATE DATABASE nextcloud;
CREATE USER 'nextcloud_user'@'localhost' IDENTIFIED BY 'Ваш_Пароль';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Шаг 6: Запуск сервисов

systemctl enable nginx --now
systemctl enable php-fpm --now

Шаг 7: Установка Nextcloud

Скачайте Nextcloud:

# cd /mnt/bigdata-vol/
# curl -o nextcloud.zip https://download.nextcloud.com/server/releases/latest.zip
# unzip nextcloud.zip -d /mnt/bigdata-vol/
# chown -R nginx:nginx /mnt/bigdata-vol/nextcloud

Суть, чтобы файлы скачанные оказались в каталоге /mnt/bigdata-vol/nextcloud. Откройте в браузере http://192.168.2.35 и завершите настройку через веб-интерфейс.

Возможно нужно будет отключить selinux и настроить firewall.

Добавить комментарий

Предыдущая запись