Nextcloud installeren met Nginx en Let’s Encrypt SSL op Ubuntu 20.04 LTS

Nextcloud is een gratis (Open Source) Dropbox-achtige software, een vork van het ownCloud project. Nextcloud is geschreven in PHP en JavaScript, het ondersteunt vele databasesystemen, zoals MySQL/MariaDB, PostgreSQL, Oracle Database, en SQLite.

Om je bestanden gesynchroniseerd te houden tussen Desktop en je eigen server, biedt Nextcloud toepassingen voor Windows, Linux, en Mac desktops en een mobiele app voor Android en iOS. Nextcloud is niet alleen een Dropbox kloon, het biedt extra functies als Agenda, Contacten, Taken plannen, en streaming media met Ampache enz.

In deze zelfstudie laten we je zien hoe je de nieuwste Nextcloud versie (op het moment van schrijven is de nieuwste versie 18) installeert en configureert op een Ubuntu 20.04 server. We zullen Nextcloud draaien met een Nginx webserver en PHP7.4-FPM en de MariaDB server gebruiken als het databasesysteem.

Vereisten

  • Ubuntu 20.04
  • Root voorrechten

Wat we zullen doen

  1. Nginx Webserver installeren
  2. Installeren en instellen van PHP7.4-FPM
  3. Installeren en instellen van MySQL server
  4. SSL genereren met Letsencrypt
  5. Nextcloud 18 downloaden
  6. Configureer Nginx Virtuele Host voor Nextcloud
  7. UFW Firewall Configuratie
  8. Nextcloud Post-Installatie

Stap 1 – Installeer Nginx Webserver

De eerste stap die we in deze nextcloud gids zullen doen is het installeren van de Nginx webserver. We zullen de Nginx webserver gebruiken in plaats van de Apache webserver.

Meld je aan op de server en werk het repository bij, installeer dan de Nginx webserver met het apt commando zoals hieronder.

sudo apt update
sudo apt install nginx -y

Nadat de installatie voltooid is, start je de Nginx dienst en zet je de dienst aan om elke keer bij het opstarten van het systeem te starten met systemctl.

systemctl start nginx
systemctl enable nginx

De Nginx dienst is opgestart en draait, controleer hem met het volgende commando.

systemctl status nginx

En je krijgt het resultaat zoals hieronder.

Installeer Nginx webserver

Het resultaat is dat de Nginx webserver geïnstalleerd is op Ubuntu 20.04.

Stap 2 – Installeer en configureer PHP7.4-FPM

Standaard wordt de Ubuntu 20.04 geleverd met de standaard versie PHP 7.4.

Installeer PHP en PHP-FPM pakketten die nodig zijn voor Nextcloud met het onderstaande apt commando.

sudo apt install php-fpm php-curl php-cli php-mysql php-gd php-common php-xml php-json php-intl php-pear php-imagick php-dev php-common php-mbstring php-zip php-soap php-bz2 -y

Nadat de installatie voltooid is, zullen we de php.ini bestanden voor php-fpm en php-cli configureren.

Ga naar de ‘/etc/php/7.4’ directory.

cd /etc/php/7.4/

Bewerk de php.ini bestanden voor php-fpm en php-cli met vim.

vim fpm/php.ini
vim cli/php.ini

Haal het commentaar weg bij de regel ‘date.timezone’ en verander de waarde met je eigen tijdzone.

date.timezone = Asia/Jakarta

Maak het commentaar op de regel ‘cgi.fix_pathinfo’ ongedaan en verander de waarde in ‘0’.

cgi.fix_pathinfo=0

Sla op en sluit af.

Bewerk vervolgens de php-fpm pool configuratie ‘www.conf’.

vim fpm/pool.d/www.conf

Haal het commentaar weg op de regels hieronder.

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

Bewaar en sluit af.

Start de PHP7.4-FPM dienst opnieuw op en zet hem aan om elke keer bij het opstarten van het systeem te starten.

systemctl restart php7.4-fpm
systemctl enable php7.4-fpm

Installeer PHP-FPM 7.4

Controleer nu de PHP-FPM dienst met het volgende commando.

ss -xa | grep php
systemctl status php7.4-fpm

En je zult zien dat php-fpm up and running is onder het sock bestand ‘/run/php/php7.4-fpm.sock’.

Controleer de PHP-FPM dienst

Stap 3 – Installeer en configureer MariaDB Server

In deze stap installeren we de nieuwste versie MariaDB en maken een nieuwe database voor de nextcloud installatie. De nieuwste versie MariaDB pakketten zijn standaard beschikbaar in de repository.

Installeer de nieuwste versie van MariaDB server met het onderstaande apt commando.

sudo apt install mariadb-server -y

Nadat de installatie voltooid is, start je de MariaDB dienst en zet je hem aan om telkens bij het opstarten van het systeem te starten.

systemctl start mariadb
systemctl enable mariadb

Controleer nu de MySQL dienst met het volgende commando.

systemctl status mariadb

Installeer MariaDB Server

De MariaDB server is up and running op Ubuntu 20.04.

Vervolgens configureren we het MariaDB root wachtwoord met het ‘mysql_secure_installation’ commando.

Voer het volgende commando uit.

mysql_secure_installation

En je wordt gevraagd om enkele configuraiton van MariaDB Server. Typ ook het nieuwe root wachtwoord voor MariaDB Server.

Enter current password for root (enter for none): Press Enter
Set root password? [Y/n] Y
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

En het MariaDB root wachtwoord is ingesteld.

Vervolgens maken we een nieuwe database voor de nextcloud installatie. We maken een nieuwe database met de naam ‘nextcloud_db’ met de gebruiker ‘nextclouduser’ en het wachtwoord ‘Nextclouduser[email protected]’.

Log in op de MySQL shell als root gebruiker met het mysql commando.

mysql -u root -p
TYPE THE MYSQL ROOT PASSWORD

Maak nu de database en gebruiker met het wachtwoord aan door de volgende MySQL query’s uit te voeren.

create database nextcloud_db;
create user [email protected] identified by '[email protected]';
grant all privileges on nextcloud_db.* to [email protected] identified by '[email protected]';
flush privileges;

En de nieuwe database en gebruiker voor de nextcloud installatie zijn gemaakt.

Maak een nieuwe database voor Nextcloud

De MariaDB installatie en configuratie voor nextcloud is voltooid.

Stap 4 – SSL genereren met Letsencrypt

In deze handleiding beveiligen we nextcloud met gratis SSL van Letsencrypt, en we genereren certificaat bestanden met het letsencrypt gereedschap.

Als je geen domeinnaam hebt of nextcloud niet op de lokale computer installeert, kun je het Zelfondertekend certificaat genereren met OpenSSL.

Installeer het ‘letsencrypt’ gereedschap met het onderstaande apt commando.

sudo apt install certbot -y

Nadat de installatie voltooid is, stop je de nginx dienst.

systemctl stop nginx

Vervolgens genereren we de SSL certificaten voor onze domeinnaam ‘nextcloud.hakase-labs.io’ met het cerbot commandolijn. Voer het onderstaande commando uit.

certbot certonly --standalone -d cloud.hakase-labs.io

Je wordt om het emailadres gevraagd, en dat wordt gebruikt voor de vernieuwingsmelding. Voor de Letsencrypt TOS overeenkomst typ je ‘A’ om akkoord te gaan en voor het delen van het emailadres typ je ‘N’ voor Nee.

Genereer Let's encrypt SSL certificaat

Als het voltooid is, krijg je het resultaat zoals hieronder.

SSL cert aangemaakt

De SSL certificaten Letsencrypt voor de netxcloud domeinnaam zijn gegenereerd, allemaal te vinden in de ‘/etc/letsencrypt/live/your-domain’ directory.

Stap 5 – Nextcloud downloaden

Voordat je de broncode van nextcloud downloadt, moet je ervoor zorgen dat het unzip pakket op het systeem geïnstalleerd is. Als je het pakket niet hebt, installeer het dan met het onderstaande apt commando.

sudo apt install wget unzip zip -y

Ga nu naar de ‘/var/www’ directory en download de nieuwste versie van Nextcloud met het volgende commando.

cd /var/www/
wget -q https://download.nextcloud.com/server/releases/latest.zip

Pak de Nextcloud broncode uit en je krijgt een nieuwe directory ‘netxcloud’, verander het eigendom van de nextcloud directory in gebruiker ‘www-data’.

unzip -qq latest.zip
sudo chown -R www-data:www-data /var/www/nextcloud

Het resultaat is dat de Nextcloud gedownload is onder de ‘/var/www/nextcloud’ directory, en dat wordt de web root directory.

Download Nextcloud

Stap 6 – Configureer Nginx Virtuele Host voor Nextcloud

In deze stap configureren we de nginx virtuele host voor nextcloud. We zullen nextcloud configureren om onder de HTTPS verbinding te draaien en zullen de HTTP verbinding automatisch naar de beveiligde HTTPS verbinding forceren.

Ga nu naar de ‘/etc/nginx/sites-available’ directory en maak een nieuw virtuele host bestand ‘nextcloud’.

cd /etc/nginx/sites-available/
vim nextcloud

Plak daar de volgende nextcloud virtuele host configuratie.

upstream php-handler {
    #server 127.0.0.1:9000;
    server unix:/var/run/php/php7.4-fpm.sock;
}

server {
    listen 80;
    listen [::]:80;
    server_name cloud.hakase-labs.io;
    # enforce https
    return 301 https://$server_name:443$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name cloud.hakase-labs.io;

    # 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/cloud.hakase-labs.io/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/cloud.hakase-labs.io/privkey.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/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 512M;
    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\/.+)\.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 headers to serve security related headers (It is intended to
        # have those duplicated to the ones above)
        # 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;

        # Optional: Don't log access to assets
        access_log off;
    }

    location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap)$ {
        try_files $uri /index.php$request_uri;
        # Optional: Don't log access to other assets
        access_log off;
    }
}

Bewaar en sluit af.

Schakel de virtuele host in en test de configuratie, en controleer of er geen fout optreedt.

ln -s /etc/nginx/sites-available/nextcloud /etc/nginx/sites-enabled/
nginx -t

Start nu de PHP7.4-FPM dienst en de nginx dienst opnieuw met het onderstaande systemctl commando.

systemctl restart nginx
systemctl restart php7.4-fpm

De Nginx virtuele host configuratie voor nextcloud is gemaakt.

Stel Nginx virtualhost in voor Nextcloud

Stap 7 – Configureer UFW Firewall

In deze zelfstudie zetten we de firewall aan, en we gebruiken de UFW firewall voor Ubuntu.

Voeg de SSH, HTTP en HTTPS toe aan de UFW firewall lijst met het onderstaande commando.

for svc in ssh http https
do
ufw allow $svc
done

Schakel daarna de UFW firewall in en controleer de toegestane diensten en poorten.

ufw enable
ufw status numbered

En je zult zien dat HTTP poort 80 en HTTPS poort 443 op de lijst staan.

Voeg SSH HTTP en HTTPS toe aan de UFW Firewall

Stap 8 – Nextcloud na de installatie

Open je webbrowser en typ het nextcloud URL adres.

http://cloud.hakase-labs.io/

En je wordt doorgestuurd naar de beveiligde HTTPS verbinding.

Op de Bovenste pagina moeten we de admin gebruiker voor nextcloud aanmaken, typ het wachtwoord voor de admin gebruiker. Typ op de configuratie ‘Data folder’ het volledige pad van de ‘data’ directory ‘/var/www/nextcloud/data’.

Scroll de pagina naar beneden, en je krijgt de configuratie van de databank. Typ de database info die we in stap 3 hebben aangemaakt en klik dan op de knop ‘Finish Setup’.

Installeer Nextcloud op Ubuntu 20.04

Als je de optie ‘Install recommended apps’ aanvinkt, krijg je de volgende pagina.

Installeer Aanbevolen Toepassing Nextcloud

Nextcloud installeert extra aanbevolen toepassingen voor je.

En als de installatie voltooid is, krijg je het Nextcloud Dashboard zoals hieronder.

Nextcloud Dashboard

De Nextcloud 18 installatie met Nginx webserver en MySQL databank op Ubuntu 20.04 is met succes voltooid.

Referentie