recent
أخبار ساخنة

شرح تثبيت وإعداد Nextcloud على Fedora ..... وتأمينه بـ SSL ... بالخطوات

الصفحة الرئيسية

شرح تثبيت وإعداد Nextcloud على Fedora  ..... وتأمينه بـ SSL ...  بالخطوات

 

Nextcloud هو برنامج مفتوح المصدر (opensource) لتخزين ومزامنة بياناتك عبر أجهزة متعددة.

يمكنك اعتباره نسخة Dropbox الخاصة بك.

ولكن بصرف النظر عن تخزين الملفات فإنه يوفر أيضًا ميزات إضافية مثل التقويم وجهات الاتصال والمهام المجدولة وmedia streaming وما إلى ذلك.

يوفر Nextcloud تطبيقات لأنظمة Windows و Linux و MacOS وتطبيقات الأجهزة المحمولة لنظامي التشغيل Android و iOS والتي يمكنك استخدامها لمزامنة الملفات عبر أجهزتك المختلفة.

سنشرح   تثبيت وإعداد Nextcloud على خادم يعتمد على Fedora 32.

سنقوم أيضًا بتثبيت خادم الويب Nginx مع PHP 7.4 و MariaDB.


المتطلبات الأساسية

خادم يعمل بنظام Fedora 32.

مستخدم sudo غير الـ root.


تأكد من تحديث كل شيء.


$ sudo dnf update


الحزم الأساسية.


$ sudo dnf install wget curl bzip2 nano unzip policycoreutils-python-utils -y


قد تكون بعض هذه الحزم موجودة بالفعل على نظامك.


إعداد جدار الحماية


الخطوة الأولى هي إعداد جدار الحماية.

يأتي خادم Fedora مزودًا بجدار حماية Firewalld مثبت مسبقًا.

تحقق مما إذا كان جدار الحماية قيد التشغيل.


$ sudo firewall-cmd --state

running


تحقق من الخدمات و المنافذ الحالية المسموح بها.


$ sudo firewall-cmd --permanent --list-services


يجب أن يظهر الناتج التالي.


dhcpv6-client mdns ssh


السماح بمنافذ HTTP و HTTPS.


$ sudo firewall-cmd --permanent --add-service=http

$ sudo firewall-cmd --permanent --add-service=https


تحقق من حالة جدار الحماية مرة أخرى.


$ sudo firewall-cmd --permanent --list-services


يجب أن ترى مخرجات مماثلة.


dhcpv6-client http https mdns ssh


أعد تحميل جدار الحماية.


$ sudo systemctl reload firewalld


تثبيت PHP


تحتوي Fedora 32 افتراضيًا على PHP 7.4 ولكن للحصول على مستودع PHP محدث سنضيف مستودع REMI.


قم بتثبيت REMI وهو مستودع Fedora الرسمي لتثبيت حزم PHP.


$ sudo dnf -y install https://rpms.remirepo.net/fedora/remi-release-32.rpm


قم بتمكين remi repository وتعطيل remi-modular.

يتيح ذلك تثبيت حزم PHP 7.4.


$ sudo dnf config-manager --set-enabled remi

$ sudo dnf config-manager --set-disabled remi-modular


قم بتثبيت PHP 7.4 مع بعض الحزم الإضافية.


$ sudo dnf install php-fpm php-cli php-gd php-mbstring php-intl php-mysqlnd php-imagick php-zip php-json php-process php-xml php-bcmath php-gmp php-ftp php-smbclient php-opcache


تحقق مما إذا كانت PHP تعمل بشكل صحيح.


$ php --version

PHP 7.4.11 (cli) (built: Sep 29 2020 10:17:06) ( NTS )

Copyright (c) The PHP Group

Zend Engine v3.4.0, Copyright (c) Zend Technologies

    with Zend OPcache v7.4.11, Copyright (c), by Zend Technologies


إعداد PHP


افتح الملف /etc/php-fpm.d/www.conf.


$ sudo nano /etc/php-fpm.d/www.conf


نحتاج إلى تعيين مستخدم / مجموعة لعمليات PHP في نظام التشغيل Unix على nginx .

ابحث عن الأسطر user=apacheو group=apache في الملف وقم بتغييرها إلى nginx.


...

; Unix user/group of processes

; Note: The user is mandatory. If the group is not set, the default user's group

;       will be used.

; RPM: apache user chosen to provide access to the same directories as httpd

user = nginx

; RPM: Keep a group allowed to write in log dir.

group = nginx

...


قم بإلغاء التعليق على متغيرات بيئة PHP.


env[HOSTNAME] = $HOSTNAME

env[PATH] = /usr/local/bin:/usr/bin:/bin

env[TMP] = /tmp

env[TMPDIR] = /tmp

env[TEMP] = /tmp


قم بإلغاء التعليق على تكوين opcache في السطر الأخير.


php_value[opcache.file_cache] = /var/lib/php/opcache


احفظ الملف بالضغط على Ctrl + X وإدخال Y عندما يُطلب منك ذلك.


الآن قم بتعديل PHP opcache /etc/php.d/10-opcache.ini.


$ sudo nano /etc/php.d/10-opcache.ini


ادخل التغييرات على النحو التالي.


opcache.enable=1

opcache.memory_consumption=128

opcache.interned_strings_buffer=8

opcache.max_accelerated_files=10000

opcache.revalidate_freq=1

opcache.save_comments=1


احفظ الملف بالضغط على Ctrl + X وإدخال Y عندما يُطلب منك ذلك.


قم بتشغيل الأوامر التالية لزيادة حدود تحميل الملفات (File upload) والذاكرة لـ PHP.


$ sudo cp /etc/php.ini /etc/php.ini.bak

$ sudo sed -i "s/memory_limit = 128M/memory_limit = 512M/" /etc/php.ini

$ sudo sed -i "s/post_max_size = 8M/post_max_size = 100M/" /etc/php.ini

$ sudo sed -i "s/upload_max_filesize = 2M/upload_max_filesize = 100M/" /etc/php.ini


بشكل افتراضي ، هناك 3 ملفات في مجلد  /var/lib/php/ تم تعيين مالك المجموعة لها apache.

لذلك نحن بحاجة لمنح مستخدم nginx أذونات القراءة والكتابة إلى المجلدات الثلاثة باستخدام setfacl.


$ sudo setfacl -R -m u:nginx:rwx /var/lib/php/opcache/

$ sudo setfacl -R -m u:nginx:rwx /var/lib/php/session/

$ sudo setfacl -R -m u:nginx:rwx /var/lib/php/wsdlcache/


قم بتمكين وبدء عملية php-fpm.


$ sudo systemctl enable php-fpm

$ sudo systemctl start php-fpm


تثبيت Nginx


يحتوي Fedora 32 بشكل افتراضي على أحدث إصدار مستقر من Nginx.

قم بتثبيت Nginx.

$ sudo dnf install nginx -y


تحقق مما إذا كان يعمل بشكل صحيح.


$ nginx -v

nginx version: nginx/1.18.0


ابدأ وفعل Nginx.



$ sudo systemctl start nginx

$ sudo systemctl enable nginx


افتح عنوان IP الخاص بخادمك في متصفح لترى الصفحة التالية.

هذا يعني أن Nginx يعمل بشكل صحيح.




تثبيت MariaDB


MariaDB هو بديل لـ MySQL مما يعني أن أوامر تشغيل MariaDB وتشغيلها هي نفس أوامر MySQL.

يحتوي Fedora 32 بشكل افتراضي على MariaDB 10.4 وهو الذي سنستخدمه.


قم بتثبيت خادم MariaDB.


$ sudo dnf install mariadb-server


تحقق مما إذا كان MariaDB مثبتًا بشكل صحيح.


$ mysql --version

mysql  Ver 15.1 Distrib 10.4.14-MariaDB, for Linux (x86_64) using  EditLine wrapper


تفعيل وبدء خدمة MariaDB.


$ sudo systemctl enable mariadb

$ sudo systemctl start mariadb


قم بتشغيل الأمر التالي لإجراء الإعدادات الافتراضية مثل إعطاء كلمة مرور الـ  root  وإزالة الـ anonymous  وعدم السماح بتسجيل الدخول إلى الـ root عن بُعد.


$ sudo mysql_secure_installation


يؤدي الضغط على Enter إلى تحديد الخيار الافتراضي (Y في هذه الحالة).


Enter current password for root (enter for none): [PRESS ENTER]

Switch to unix_socket authentication [Y/n] [PRESS ENTER]

Change the root password? [Y/n] [ANSWER n]

Remove anonymous users? [Y/n] [PRESS ENTER]

Disallow root login remotely? [Y/n] [PRESS ENTER]

Remove test database and access to it? [Y/n] [PRESS ENTER]

Reload privilege tables now? [Y/n] [PRESS ENTER]


في المرة القادمة التي تريد فيها تسجيل الدخول إلى MySQL استخدم الأمر التالي


$ sudo mysql


أدخل كلمة مرور الـ root الخاصة بك عندما يُطلب منك ذلك.


إعدادات MariaDB


أدخل الأمر التالي للدخول إلى MySQL shell.


$ sudo mysql


أنشئ مستخدم MySQL للتعامل مع قاعدة بيانات NextCloud.


mysql> CREATE USER 'nextuser'@'localhost' IDENTIFIED BY 'yourpassword';


قم بإنشاء قاعدة بيانات NextCloud.


mysql> CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;


امنح كل الامتيازات لقاعدة بيانات Nextcloud للمستخدم الذي أنشأناه.


mysql> GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextuser'@'localhost';


قم بإنهاء MySQL Shell.


mysql> exit


تحميل Nextcloud


حان الوقت لتحميل مجلدات Nextcloud وإعدادها.


$ wget https://download.nextcloud.com/server/releases/latest.tar.bz2

$ tar -jxvf latest.tar.bz2

$ sudo mv nextcloud /var/www/html/


نحتاج إلى إنشاء مجلد البيانات.


$ sudo mkdir /var/www/html/nextcloud/data

$ sudo chown -R nginx:nginx /var/www/html/nextcloud


تثبيت SSL


سنقوم بتثبيت SSL باستخدام خدمة Let's Encrypt.


قم بتثبيت Certbot.


$ sudo dnf install certbot


أوقف Nginx لأنه سيتداخل مع Certbot.


$ sudo systemctl stop nginx


إنشئ certificate نقوم أيضًا بإنشاء certificate لـ DHParams.


$ export LDOMAIN="nextcloud.example.com"

$ export LEMAIL="email@example.com"

$ sudo certbot certonly --standalone -d $LDOMAIN --preferred-challenges http --agree-tos -n -m $LEMAIL --keep-until-expiring 

$ sudo systemctl start nginx

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048


نحتاج إلى إعداد وظيفة cron لتجديد SSL تلقائيًا.

لفتح محرر crontab ، قم بتشغيل الأمر التالي


$ sudo EDITOR=nano crontab -e


يفتح الأمر أعلاه Crontab باستخدام محرر Nano بدلاً من محرر Vim الافتراضي.


الصق السطر التالي في الأسفل.


25 2 * * * /usr/bin/certbot renew --quiet --pre-hook “systemctl stop nginx” --post-hook “systemctl start nginx”


ستقوم وظيفة cron بتشغيل  certbot في 2:25 صباحًا كل يوم.

يمكنك تغييره إلى أي شيء تريده.

احفظ الملف بالضغط على Ctrl + X وإدخال Y عندما يُطلب منك ذلك.


إعدادات SELinux


يحتاج SELinux إلى الإعدادات  لجعل Nextcloud يعمل على Fedora.

أدخل الأوامر التالية لإعدادات SELinux الأساسية التي يجب أن تعمل مع الجميع.


تأكد من ضبط مسارات الملفات إذا كانت مختلفة.


$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/data(/.*)?'

$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/config(/.*)?'

$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/apps(/.*)?'

$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/.user.ini'

$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/3rdparty/aws/aws-sdk-php/src/data/logs(/.*)?'

$ sudo restorecon -Rv '/var/www/html/nextcloud/'


لتمكين التحديثات عبر واجهة الويب الخاصة بـ Nextcloud ، قم بتشغيل الأمر التالي أيضًا.


$ sudo setsebool -P httpd_unified on


نحتاج إلى إعدادات Nginx لاستضافة Nextcloud.


كمثال سيتم استضافة Nextcloud على النطاق http://nextcloud.example.com


قم بإعداد المجلدات على الخادم.


$ sudo mkdir /etc/nginx/sites-available

$ sudo mkdir /etc/nginx/sites-enabled


افتح /etc/nginx/nginx.confالملف للتعديل.


$ sudo nano /etc/nginx/nginx.conf


الصق الأسطر التالية بعد السطر include /etc/nginx/conf.d/*.conf


include /etc/nginx/sites-enabled/*.conf;

server_names_hash_bucket_size 64;


اضغط على Ctrl + X لإغلاق المحرر واضغط على Y عندما يُطلب منك حفظ الملف.


قم بإنشاء الملف /etc/nginx/sites-available/nextcloud.conf باستخدام محرر Nano.


$ sudo nano /etc/nginx/sites-available/nextcloud.conf


قم بلصق الكود التالي في المحرر.

تأكد من استبدال نموذج المجال (example domain) بنطاقك (domain ) الحقيقي قبل اللصق.


upstream php-handler {

    #server 127.0.0.1:9000;

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

}

server {

    listen 80;

    listen [::]:80;

    server_name nextcloud.example.com;

    # enforce https

    return 301 https://$server_name:443$request_uri;

}

server {

    listen 443 ssl http2;

    listen [::]:443 ssl http2;

    server_name nextcloud.example.com;

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

    error_log /var/log/nginx/nextcloud.error.log;

    # Use Mozilla's guidelines for SSL/TLS settings

    # https://mozilla.github.io/server-side-tls/ssl-config-generator/

    # NOTE: some settings below might be redundant

    ssl_certificate /etc/letsencrypt/live/nextcloud.example.com/fullchain.pem;

    ssl_certificate_key /etc/letsencrypt/live/nextcloud.example.com/privkey.pem;

ssl_protocols TLSv1.2 TLSv1.3;

ssl_session_timeout 1d;

    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions

    ssl_session_tickets off;

ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

    ssl_prefer_server_ciphers off;

ssl_dhparam /etc/ssl/certs/dhparam.pem;

    # Add headers to serve security related headers

    # Before enabling Strict-Transport-Security headers please read into this

    # topic first.

    #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;

    #

    # WARNING: Only add the preload option once you read about

    # the consequences in https://hstspreload.org/. This option

    # will add the domain to a hardcoded list that is shipped

    # in all major browsers and getting removed from this list

    # could take several months.

    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;

    # Path to the root of your installation

    root /var/www/html/nextcloud;

    location = /robots.txt {

        allow all;

        log_not_found off;

        access_log off;

    }

    # The following 2 rules are only needed for the user_webfinger app.

    # Uncomment it if you're planning to use this app.

    #rewrite ^/.well-known/host-meta /public.php?service=host-meta last;

    #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

    # The following rule is only needed for the Social app.

    # Uncomment it if you're planning to use this app.

    #rewrite ^/.well-known/webfinger /public.php?service=webfinger last;

    location = /.well-known/carddav {

      return 301 $scheme://$host:$server_port/remote.php/dav;

    }

    location = /.well-known/caldav {

      return 301 $scheme://$host:$server_port/remote.php/dav;

    }

    # set max upload size

    client_max_body_size 100M;

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

    # Uncomment if your server is build with the ngx_pagespeed module

    # This module is currently not supported.

    #pagespeed off;

    location / {

        rewrite ^ /index.php;

    }

    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\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy)\.php(?:$|\/) {

        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;

        # Avoid sending the security headers twice

        fastcgi_param modHeadersAvailable true;

        # Enable pretty urls

        fastcgi_param front_controller_active true;

        fastcgi_pass php-handler;

        fastcgi_intercept_errors on;

        fastcgi_request_buffering off;

    }

    location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {

        try_files $uri/ =404;

        index index.php;

    }

    # Adding the cache control header for js, css and map files

    # Make sure it is BELOW the PHP block

    location ~ \.(?:css|js|woff2?|svg|gif|map)$ {

        try_files $uri /index.php$request_uri;

        add_header Cache-Control "public, max-age=15778463";

        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;

        # Optional: Don't log access to assets

        access_log off;

    }

    location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap|mp4|webm)$ {

        try_files $uri /index.php$request_uri;

        # Optional: Don't log access to other assets

        access_log off;

    }

}

اضغط على Ctrl + X لإغلاق المحرر واضغط على Y عندما يُطلب منك حفظ الملف.


قم بتنشيط ملف الإعدادات هذا عن طريق ربطه sites-enabled بالمجلد.


$ sudo ln -s /etc/nginx/sites-available/nextcloud.conf /etc/nginx/sites-enabled/


اختبر إعدادات Nginx التي قمت بها


$ sudo nginx -t


أعد تحميل (Reload) خدمة Nginx إذا كان كل شيء على ما يرام.


$ sudo systemctl reload nginx


تثبيت Nextcloud


هناك طريقتان لإعداد Nextcloud - عبر سطر الأوامر أو عبر الواجهة الرسومية. سنختار طريقة سطر الأوامر.


أدخل مجلد Nextcloud.


$ cd /var/www/html/nextcloud


قم بتشغيل الأمر التالي لتثبيت Nextcloud.


$ sudo -u nginx php occ  maintenance:install --database "mysql" --database-name "nextcloud"  --database-user "nextuser" --database-pass "yourpassword" --admin-user "admin" --admin-pass "password"


يتم تشغيل هذا الأمر nginx كمستخدم لأنه يمتلك أذونات كتابة إلى مجلد Nextcloud.


نحتاج إلى إضافة مجالنا إلى قائمة المجالات الموثوقة. افتح /var/www/html/nextcloud/config/config.phpالملف.


$ sudo nano config/config.php


قم بتغيير قيمة trusted_domains المتغير عن طريق إضافة عنوان IP الخاص بالخادم ومجال Nextcloud الخاص بك nextcloud.example.com إليه حتى تتمكن من الوصول إلى التثبيت من المجال الخاص بك.


'trusted_domains' =>

  array (

    0 => 'localhost',

    1 => '167.172.35.56',

    2 => 'nextcloud.example.com',

  ),


اضغط على Ctrl + X لإغلاق المحرر واضغط على Y عندما يُطلب منك حفظ الملف.


قم بتشغيل تثبيت Nextcloud الخاص بك عن طريق الفتح https://nextcloud.example.comفي متصفحك وسترى الشاشة التالية.





أدخل تفاصيل تسجيل الدخول.

 قم بالتمرير عبر لافتات Nextcloud التمهيدية وقم بتعيين موقع الطقس وحالتك واختر خلفية ، وبمجرد الانتهاء من ذلك ، يجب أن يتم الترحيب بك بشاشة مماثلة.


google-playkhamsatmostaqltradent