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

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

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

Требования для установки Nextcloud на МСВСфера 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.

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

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