Миграция виртуальной машины с nextcloud

Предыстория:

Давным-давно (примерно 1.5 года назад) один гениальный человек поставил и настроил облачный сервис для сотрудников на базе nextcloud. Всё это было сделано на кластерной машине с Windows Server 2016 в виртуальной машине на hyper-v под управлением CentOS 8 (более подробно ниже). Человек уволился полгода назад и уже сам не помнит что и как настраивал, но всё работало, всех всё устраивало и данный сервис оставили бы в покое, если бы организация не решила обновить лес и домен до 2019 сервера. И тут вступаю в игру я и… всё ломаю :laughing:

Как всё началось и сиптомы:

Сервер решили ставить на чистую, но для начала нужно было переместить все виртуальные машины путем экспорта-импорта. И так, выключил, экспортировал, перенёс, затем импорт с регистрацией на другой машине так же под управлением 2016го сервера. Как результат после запуска - вместо сайта “share.НАШ_САЙТ.ru” (ххх.ххх.ххх.хх7) открывается просто “НАШ_САЙТ.ru”, который к nexcloud’у имеет отношение косвенное и находится на другом сервере ххх.ххх.ххх.хх8, при чём сайт не доступен из внешней сети. При открытии по локальному IP адресу вирт.машины с nextcloud такая же история.

Удалил импортированную машину в Hyper-V второго сервера, запустил вновь на первоначальном - проблема осталась. Проверяю ночью после долгих ковыряний на работе - выдает уже такую ошибку :sweat:
Internal Server Error
The server encountered an internal error and was unable to complete your request.
Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report.
More details can be found in the server log.

При попытке доступа на сайт по url через CURLиз самой вирт.машины идет обращение к верному IP ххх.ххх.ххх.хх7

Спойлер

curl share

Если же ту же операцию провести для локального IP вирт.машины 192.168.10.55 то обращение уже идёт к неправильному IP ххх.ххх.ххх.хх8

Спойлер

Конфигурация:

ОС: CentOS 8
Веб-сервер: Nginx 1.14.1
БД: PostgreSQL 10.14 (почему-то без postgre-server)
PHP: php-fpm 7.3.24 (php php-fpm php-cli php-pgsql php-process php-imagick php-zip php-bcmath php-apcu php-igbinary php-xml php-mbstring php-gd php-ldap php-imap php-smbclient php-gmp php-intl php-crypto)
Nextcloud: 20.0.0
Кэширование не включено насколько понимаю, т.к. установлен лишь php-pecl-acpu

Логи:

/var/log/nging/access.log

Спойлер

nginx_accessLOG

/var/log/nginx/error.log

Спойлер

/var/log/php-fpm/error.log
Оказалось пусто

/var/www/nextcloud/data/nextcloud.log

Спойлер

nextcloudLOG

Конфигурационные файлы:

/etc/nginx/nginx.conf

Спойлер

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.

include /usr/share/nginx/modules/*.conf;

events {
worker_connections 1024;
}

http {
log_format main '$remote_addr - $remote_user [$time_local] “$request” ’
'$status $body_bytes_sent “$http_referer” ’
‘"$http_user_agent" “$http_x_forwarded_for”’;

access_log  /var/log/nginx/access.log  main;


client_max_body_size 4096M;
server_tokens       off;
sendfile            on;
tcp_nopush          on;
tcp_nodelay         on;
keepalive_timeout   65;
types_hash_max_size 2048;

include             /etc/nginx/mime.types;
default_type        application/octet-stream;

# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;

server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  _;
    root         /usr/share/nginx/html;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location / {
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

/etc/nginx/conf.d/share. НАШ_САЙТ.ru.conf

Спойлер

server {
listen 80;
listen [::]:80;
server_name 192.168.10.55 share.НАШ_САЙТ.ru;

root /var/www/nextcloud;

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";

# Remove X-Powered-By, which is an information leak
fastcgi_hide_header X-Powered-By;


# 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/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;

location / {
    rewrite ^ /index.php$uri;
}

location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
    deny all;
}

location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
    deny all;
}

location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+)\.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;
    #Avoid sending the security headers twice
    fastcgi_param modHeadersAvailable true;
    fastcgi_param front_controller_active true;
    fastcgi_pass unix:/run/php-fpm/www.sock;
    fastcgi_intercept_errors on;
    fastcgi_request_buffering off;
}

location ~ ^/(?:updater|ocs-provider)(?:$|/) {
    try_files $uri/ =404;
    index index.php;
}

location ~ \.(?:css|js|woff|svg|gif)$ {
    try_files $uri /index.php$uri$is_args$args;
    add_header Cache-Control "public, max-age=15778463";
    add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;
    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;
}

location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {
    try_files $uri /index.php$uri$is_args$args;
    access_log off;
}

}

/var/www/nextcloud/config/config.php

Спойлер <?php $CONFIG = array ( 'instanceid' => 'АйДи', 'passwordsalt' => 'ПАРОЛЬ', 'secret' => 'СЕКРЕТ', 'trusted_domains' => array ( 0 => '192.168.10.55', ), 'trusted_proxies' => array ( 0 => '10.0.1.1', ), 'enable_previews' => true, 'enabledPreviewProviders' => array ( 0 => 'OC\\Preview\\TXT', 1 => 'OC\\Preview\\MarkDown', 2 => 'OC\\Preview\\OpenDocument', 3 => 'OC\\Preview\\PDF', 4 => 'OC\\Preview\\MSOffice2003', 5 => 'OC\\Preview\\MSOfficeDoc', 6 => 'OC\\Preview\\PDF', 7 => 'OC\\Preview\\Image', 8 => 'OC\\Preview\\Photoshop', 9 => 'OC\\Preview\\TIFF', 10 => 'OC\\Preview\\SVG', 11 => 'OC\\Preview\\Font', 12 => 'OC\\Preview\\MP3', 13 => 'OC\\Preview\\Movie', 14 => 'OC\\Preview\\MKV', 15 => 'OC\\Preview\\MP4', 16 => 'OC\\Preview\\AVI', ), 'overwritehost' => 'share.НАШ_САЙТ.ru', 'overwriteprotocol' => 'https', 'overwritewebroot' => '', 'overwritecondaddr' => '^10\\.0\\.1\\.1$', 'datadirectory' => '/var/www/nextcloud/data', 'dbtype' => 'pgsql', 'version' => '20.0.0.9', 'overwrite.cli.url' => 'http://192.168.10.55', 'dbname' => 'nextcloud', 'dbhost' => '192.168.10.4:5432', 'dbport' => '', 'dbtableprefix' => 'oc_', 'dbuser' => 'nextcloud', 'dbpassword' => 'ПАРОЛЬ', 'installed' => true, 'maintenance' => false, 'mail_from_address' => 'share', 'mail_smtpmode' => 'smtp', 'mail_sendmailmode' => 'smtp', 'mail_domain' => 'НАШ_САЙТ.ru', 'mail_smtpauthtype' => 'LOGIN', 'mail_smtphost' => '192.168.10.9', 'mail_smtpport' => '25', 'memcache.local' => '\\OC\\Memcache\\APCu', 'ldapIgnoreNamingRules' => false, 'ldapProviderFactory' => 'OCA\\User_LDAP\\LDAPProviderFactory', 'mail_smtpauth' => 1, 'mail_smtpname' => 'СМТРИМЯ', 'mail_smtppassword' => 'СМТРПАРОЛЬ', );

/etc/php.ini /etc/php-fpm.conf (у этих двух минимальные изменения) /etc/php-fpm.d/www.conf (здесь лишь заменен пользователь с дефолтного apache на nginx)

Протестировал “sudo -u nginx php /var/www/nextcloud/index.php”. Дало следующий результат:

Спойлер

indexphp

Новые логи:

Спойлер

Временно отключили SELinux и “О чудо!” оно заработало!)

Отталкиваясь от этого пришлось донастроить SELinux и теперь всё работает даже с включенным таковым (после перезагрузки VM тоже проверил :wink:).

Ниже приведу мини-инструкцию, возможно кому-то поможет.

Спойлер

НАСТРОЙКА SELINUX CentOS 8 ДЛЯ nextcloud + nginx

Настройки для /home/nextcloud.
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/data(/.*)?'

Настройки для config.
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/config(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/etc/nginx/conf.d(/.*)?'

Настройки для apps.
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/apps(/.*)?'

Настройки для .htaccess.
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/.htaccess'

Настройки для .user.ini.
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/.user.ini'

Настройки для logs.
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/3rdparty/aws/aws-sdk-php/src/data/logs(/.*)?'

Применяем параметры.
sudo restorecon -Rv '/etc/nginx/conf.d/'
sudo restorecon -Rv '/var/www/nextcloud/'

Дополнительная настройка необходима, если nextcloud подключается к удаленной базе данных:
setsebool -P httpd_can_network_connect_db on

Разрешить подключения LDAP
setsebool -P httpd_can_connect_ldap on

Nextcloud требует доступа к удаленным сетям для таких функций, как обмен данными между серверами, внешние хранилища или магазин приложений. Чтобы разрешить этот доступ, используйте следующую настройку:
setsebool -P httpd_can_network_connect on

Доступ к memcache по сети. Предыдущая команда так же автоматически делает то, что делает следующая команда, поэтому при применении предыдущей выполнение следующей команды не требуется.
setsebool -P httpd_can_network_memcache on

Разрешить доступ к SMTP / sendmail
setsebool -P httpd_can_sendmail on

Разрешить доступ к CIFS / SMB
Если вы разместили свой каталог данных на общем ресурсе CIFS / SMB
setsebool -P httpd_use_cifs on

Ссылки для понимания:
Nextcloud installation and settings

SELinux configuration tips

Установка Nextcloud на CentOS 8 (раздел про настройку SELinux )

Шпаргалка по SELinux )