Nextcloud هو برنامج مفتوح المصدر (opensource) لتخزين ومزامنة بياناتك عبر أجهزة متعددة.
يمكنك اعتباره نسخة Dropbox الخاصة بك.
ولكن بصرف النظر عن تخزين الملفات فإنه يوفر أيضًا ميزات إضافية مثل التقويم وجهات الاتصال والمهام المجدولة وmedia streaming وما إلى ذلك.
سنشرح تثبيت وإعداد 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.
$ 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 صباحًا كل يوم.
يمكنك تغييره إلى أي شيء تريده.
إعدادات 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 التمهيدية وقم بتعيين موقع الطقس وحالتك واختر خلفية ، وبمجرد الانتهاء من ذلك ، يجب أن يتم الترحيب بك بشاشة مماثلة.