Nextcloud te installeren en in te stellen op Fedora 32

Nextcloud is een opensource software om je gegevens op te slaan en te synchroniseren op meerdere apparaten. Je kunt het beschouwen als je eigen Dropbox kloon. Maar behalve bestanden opslaan biedt het ook extra functies zoals Agenda, Contacten, Geplande Taken, media streaming enz.

Nextcloud biedt apps voor Windows, Linux, MacOS en mobiele apps voor Android en iOS die je kunt gebruiken om bestanden over je verschillende apparaten te synchroniseren.

In deze zelfstudie leren we hoe je Nextcloud installeert en configureert op een Fedora 32 gebaseerde server. We zullen ook Nginx webserver installeren, samen met PHP 7.4 en MariaDB

Vereisten

  • Een server waarop Fedora 32 draait.

  • Een niet-root sudo gebruiker.

  • Zorg ervoor dat alles bijgewerkt is.

    $ sudo dnf update
    
  • Essentiële pakketten.

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

    Sommige van deze pakketten kunnen al op je systeem staan.

Configureer de firewall

De eerste stap is het instellen van de firewall. Fedora server wordt geleverd met Firewalld firewall voorgeïnstalleerd.

Controleer of de firewall draait.

$ sudo firewall-cmd --state
running

Controleer de huidige toegestane diensten/poorten.

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

Het zou de volgende uitvoer moeten tonen.

dhcpv6-client mdns ssh

Sta HTTP en HTTPS poorten toe.

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

Controleer nogmaals de status van de firewall.

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

Je zou een gelijkaardige uitvoer moeten zien.

dhcpv6-client http https mdns ssh

Herlaad de firewall.

$ sudo systemctl reload firewalld

Installeer PHP

Fedora 32 wordt standaard geleverd met PHP 7.4 maar om een bijgewerkte PHP repository te hebben, zullen we de REMI repository toevoegen.

Installeer de REMI repository die de officiële Fedora repository is voor het installeren van PHP pakketten.

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

Schakel de remi repository in en de remi-modular repository uit. Dit schakelt de repository in die nodig is om PHP 7.4 pakketten te installeren.

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

Installeer PHP 7.4 samen met enkele aanvullende pakketten.

$ 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

Controleer of PHP correct werkt.

$ 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

Configureer PHP

Open het bestand /etc/php-fpm.d/www.conf.

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

We moeten de Unix gebruiker/groep van PHP processen instellen op nginx. Zoek de regels user=apache en group=apache in het bestand en verander ze in 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
...

Haal het commentaar weg bij de PHP omgevingsvariabelen hieronder.

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

Haal het commentaar weg bij de opcache configuratie op de laatste regel.

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

Sla het bestand op door op Ctrl + X te drukken en Y in te voeren als daarom gevraagd wordt.

Bewerk nu de PHP opcache configuratie /etc/php.d/10-opcache.ini.

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

Verander de configuratie als hieronder.

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

Sla het bestand op door op Ctrl + X te drukken en Y in te voeren als daarom wordt gevraagd.

Voer de volgende commando's uit om de Bestandsupload en Geheugen grenzen voor PHP te verhogen.

$ 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

Standaard staan er 3 bestanden in de map /var/lib/php/ waarvan de groepseigenaar ingesteld is op apache, maar we gebruiken Nginx. We moeten dus de nginx gebruiker permissies geven om te lezen en te schrijven naar de 3 mappen met 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/

Schakel het php-fpm proces in en start het.

$ sudo systemctl enable php-fpm
$ sudo systemctl start php-fpm

Installeer Nginx

Fedora 32 wordt standaard geleverd met de nieuwste Stable versie van Nginx.

Installeer Nginx.

$ sudo dnf install nginx -y

Controleer of het correct werkt.

$ nginx -v
nginx version: nginx/1.18.0

Start Nginx en schakel het in.

$ sudo systemctl start nginx
$ sudo systemctl enable nginx

Open het IP adres van je server in een browser om de volgende pagina te zien. Dat betekent dat Nginx goed werkt.

Fedora Standaard Nginx Pagina

Installeer MariaDB

MariaDB is een drop-in vervanger voor MySQL, wat betekent dat de commando's om MariaDB te draaien en te bedienen dezelfde zijn als die voor MySQL.

Fedora 32 wordt standaard geleverd met MariaDB 10.4 en dat is degene die we zullen gebruiken.

Installeer MariaDB server.

$ sudo dnf install mariadb-server

Controleer of MariaDB correct geïnstalleerd is.

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

Schakel de MariaDB dienst in en start hem.

$ sudo systemctl enable mariadb
$ sudo systemctl start mariadb

Voer het volgende commando uit om standaard instellingen uit te voeren, zoals het geven van een root wachtwoord, het verwijderen van anonieme gebruikers, het op afstand verbieden van root login en het laten vallen van testtabellen.

$ sudo mysql_secure_installation

Door op Enter te drukken kies je de standaard optie (die met een hoofdletter, Y in dit geval).

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]

Dat is het. De volgende keer dat je in MySQL wilt inloggen, gebruik je het volgende commando

$ sudo mysql

Voer je root wachtwoord in als daarom gevraagd wordt.

MariaDB configureren

Voer het volgende commando in om in de MySQL shell te komen.

$ sudo mysql

Maak een MySQL gebruiker aan om de NextCloud Database te beheren.

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

Maak de NextCloud database aan.

mysql> CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

Verleen alle rechten voor de Nextcloud database aan de gebruiker die we maakten.

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

Sluit de MySQL Shell af.

mysql> exit

Nextcloud downloaden

Tijd om de Nextcloud mappen te downloaden en in te stellen.

$ wget https://download.nextcloud.com/server/releases/latest.tar.bz2
$ tar -jxvf latest.tar.bz2
$ sudo mv nextcloud /var/www/html/

Vervolgens moeten we een gegevensmap maken.

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

SSL installeren

We zullen SSL installeren met de Let's Encrypt dienst.

Installeer daarvoor Certbot.

$ sudo dnf install certbot

Stop Nginx want dat zal het Certbot proces hinderen.

$ sudo systemctl stop nginx

Genereer het certificaat. We maken ook een DHParams certificaat.

$ export LDOMAIN="nextcloud.example.com"
$ export LEMAIL="[email protected]"
$ 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

We moeten ook een cron job instellen om de SSL automatisch te vernieuwen. Om de crontab editor te openen, voer je het volgende commando uit

$ sudo EDITOR=nano crontab -e

Het bovenstaande commando opent Crontab met Nano editor in plaats van de standaard Vim editor.

Plak de volgende regel onderaan.

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

De bovenstaande cron job zal certbot elke dag om 2:25 uur draaien. Je kunt het veranderen in wat je maar wilt.

Bewaar het bestand door op Ctrl + X te drukken en Y in te voeren wanneer daarom gevraagd wordt.

Configureer SELinux/permissies

SELinux moet ingesteld worden om Nextcloud op Fedora te laten werken. Voer de volgende commando's in voor basis SELinux instellingen die voor iedereen zouden moeten werken.

Zorg ervoor dat je de bestandspaden aanpast als ze bij jou anders zijn.

$ 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/'

Om updates via de Nextcloud's webinterface in te schakelen, voer je ook het volgende commando uit.

$ sudo setsebool -P httpd_unified on

Configureer Nginx voor Nextcloud

Vervolgens moeten we Nginx instellen voor het hosten van Nextcloud.

Voor ons doel zal Nextcloud gehost worden op het domein http://nextcloud.example.com,

Zet mappen op waar de serverblokken zullen komen te staan.

$ sudo mkdir /etc/nginx/sites-available
$ sudo mkdir /etc/nginx/sites-enabled

Open het /etc/nginx/nginx.conf bestand om het te bewerken.

$ sudo nano /etc/nginx/nginx.conf	

Plak de volgende regels na de regel include /etc/nginx/conf.d/*.conf

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

Druk op Ctrl + X om de editor te sluiten en druk op Y als je gevraagd wordt het bestand op te slaan.

Maak het bestand /etc/nginx/sites-available/nextcloud.conf met Nano editor.

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

Plak de volgende code in de editor. Zorg ervoor dat je het voorbeeld domein vervangt door je echte domein alvorens te plakken.

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

Druk op Ctrl + X om de editor te sluiten en druk op Y als gevraagd wordt om het bestand op te slaan.

Activeer dit configuratiebestand door het te linken naar de sites-enabled directory.

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

Test de Nginx configuratie.

$ sudo nginx -t

Herlaad de Nginx dienst als alles in orde is.

$ sudo systemctl reload nginx

Installeer Nextcloud

Er zijn twee manieren om Nextcloud in te stellen - via de commandoregel of via de grafische interface. We zullen kiezen voor de commandoregel methode.

Ga de Nextcloud directory binnen.

$ cd /var/www/html/nextcloud

Voer het volgende commando uit om Nextcloud te installeren.

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

Dit commando wordt uitgevoerd als nginx gebruiker omdat die schrijfrechten heeft op de Nextcloud map.

Vervolgens moeten we ons domein toevoegen aan de lijst met vertrouwde domeinen. Open het /var/www/html/nextcloud/config/config.php bestand.

$ sudo nano config/config.php

Verander de Waarde van de variabele trusted_domains door er je Server IP adres en je Nextcloud domein nextcloud.example.com aan toe te voegen, zodat je je installatie vanaf je domein kunt benaderen.

'trusted_domains' =>
  array (
    0 => 'localhost',
    1 => '167.172.35.56',
    2 => 'nextcloud.example.com',
  ),

Druk op Ctrl + X om de editor te sluiten en druk op Y als dat gevraagd wordt om het bestand op te slaan.

Start je Nextcloud installatie door https://nextcloud.example.com in je browser te openen en je ziet het volgende scherm.

Nextcloud inlogpagina

Voer je beheerders login gegevens in. Scroll door de inleidende Nextcloud banners, stel je weerlocatie en status in en kies een achtergrond en als je klaar bent zou je begroet moeten worden met een gelijkaardig scherm.

Nextcloud Homepage

Conclusie

Dit beëindigt onze zelfstudie over het installeren van Nextcloud op Fedora 32 server. Als je nog vragen hebt, stel ze dan in de reacties hieronder.