Nextcloud — это open-source-решение для синхронизации и обмена файлами, которое можно развернуть на собственном сервере. Оно служит полноценной альтернативой таким сервисам, как Google Drive, Dropbox и OwnCloud, предлагая даже больше возможностей.
Зачем устанавливать Nextcloud на МСВСфера 9?
- Полный контроль над данными (все файлы хранятся на вашем сервере).
- Высокая безопасность (поддержка шифрования, 2FA, аудит доступа).
- Гибкость (можно расширять функционал плагинами).
- Бесплатно и открытый код (не нужно платить за подписки).
Требования для установки 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.