#Nextcloud auf #Ubuntu 16.04 #Xenial mit #mysql und #letsencrypt, vereinfachte Bereitstellung

Nextcloud hatte ich vor kurzem kennengelernt, als ich die Frage stellte, was man für Cloudsoftware denn nehmen solle. Die Frage nach Owncloud hätte ich besser nicht stellen sollen. Mit Verlaub, solltest Du eine Wolke selber bauen, bist Du dann auch für die Sicherheit verantwortlich. Das ist alles noch so ziemlich BETA, wie ich finde. Sofern Du Dir das aber zutraust, geht es so, denke ich.  Das hier ist eine vereinfachte Bereitstellung, diese VM hat nix anders zu tun als Nextcloud bereitzustellen. Nextcloud wird direkt im document-root bereitgestellt, hat also keine gesonderte vhost, um die korrekte Konfiguration des Apache mit TLS kümmert sich da letsencrypt, Du brauchst Dir also auch keine Sorgen zu machen, bei Qualys ein schlechtes Ergebnis zu bekommen – das kann das Ding so recht gut. Es gibt kein nginx, auch nur APCu Memcache, das sollte aber für sehr kleine Umgebungen mehr als reichen.

Für meinen Freund Marko Ruschin.

Vorraussetzungen:

  • Ubuntu 16.04 Xenial Xerus mit Openssh-server (Link)
  • VM=2vCPU, 2048G+
  • Statische, interne IP (Link)
  • DNS-Einträge für <servername.domain.tld> zeigen auf die öffentliche IP der Hütte
  • Öffentlich Erreichbarkeit von 443 und 80 (Firewall, NAT/Maskerade) – Ich hasse übrigens NAT

Dynamisches DNS, Anmerkungen gesondert für Lancom:

  • Mit SPDNS geht das so: Link
  • Ich schreibe bald mal eine Howto, wie das mit All-Inkl und Lancom direkt geht
    Mit All-Inkl geht das so: Link

Variablen:

URI der Wolke: <servername.domain.tld>/nextcloud
Datenbank Root Kennwort: <mysqlrootpassword>
Kennwort des Datenbanknutzers nextcloud: <ncdbpassword>
Dein Adminbenutzer bei Nextcloud: <ncwebadmin>
Dein Adminpasswort bei Nextcloud: <ncwebadminpassword>

Losgehts.

Nachfolgendes im Kontext von root (sudo)

Hütte aktualisieren:

apt update && apt upgrade && apt dist-upgrade

Pakete installieren und <mysqlrootpassword> vergeben:

apt install apache2 mysql-server libapache2-mod-php php-gd php-json php-mysql php-curl php-intl php-mcrypt php-imagick php-dom php-zip php-mbstring php-apcu python-letsencrypt-apache unzip

MySQL zumachen:

mysql_secure_installation

mySQL Kommandos am besten zu Fuß tippen,  Hochkommata mag Dein Computer eventuell nicht kopieren

Datenbank anlegen

mysql -u root -p
<mysqlrootpassword>
create database nextcloud;
CREATE USER 'nextcloud'@‚'localhost' IDENTIFIED BY '<ncdbpassword>';
grant all on nextcloud.* to 'nextcloud'@'localhost';
quit;

Nextcloud Datenverzeichnis anlegen, außerhalb von document-root

mkdir /var/www/ncdata
chown www-data:www-data /var/www/ncdata -R

Nextcloud herunterladen, entpacken und nach html schubsen. Nextcloud könnte es ggf. in neuerer Version geben, also da auch mal nachgucken: Link. Diese Anleitung bezieht sich auf Version 10.0

wget https://download.nextcloud.com/server/releases/nextcloud-10.0.0.zip
unzip nextcloud-10.0.0.zip
mv nextcloud /var/www/html/nextcloud
chown www-data:www-data /var/www/html/nextcloud/ -R
rm nextcloud-10.0.0.zip

Letsencrypt Zertifikate erstellen, im Menü korrekte Emailadresse eintragen, Secure wählen:

letsencrypt --apache -d <servername.domain.tld>
letsencrypt renew

Apache anpassen (wer weiß, ob was fehlt, doppelt gemoppelt hält besser)

a2enmod rewrite
a2enmod headers
a2enmod env
a2enmod dir
a2enmod mime
a2enmod setenvif
a2enmod ssl

PHP Upload Größe editieren

nano /etc/php/7.0/apache2/php.ini

Nach Dokumentation (Link) folgende Einstellungen definieren:

php_value upload_max_filesize = 16G
php_value post_max_size = 16G
php_value max_input_time 3600
php_value max_execution_time 3600

Apache-Default-Konfiguration anpassen

nano /etc/apache2/sites-available/000-default-le-ssl.conf

und am Ende der conf hinzufügen, frei nach Doku (Link):

<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
</IfModule>

Apache durchstarten:

service apache2 restart

Nextcloud einmalig starten und damit config.php generieren:

http://<servername.domain.tld>/nextcloud

Folgendes müsstest Du da einklappern:

Nutzer ist <ncwebadmin>
Kennwort ist <ncwebadminpassword>
Datenverzeichnis ist /var/www/ncdata (ACHTUNG - BITTE ZWINGEND ANPASSEN)
Datenbankusername ist nextcloud
Kennwort ist <ncdbpassword>
Datenbank ist nextcloud
Ort ist localhost

Beispielhafter Screenshot dafür hier:

bildschirmfoto-2016-09-20-um-10-09-33

Wenn Du schon da bist, kannst Du gleich die Cron-Konfiguration im Admininterface anpassen:
bildschirmfoto-2016-09-20-um-12-19-59Den Cronjob dafür bauen wir aber gleich erst.

Dann kannst Du die config.php anpassen:

nano /var/www/html/nextcloud/config/config.php

und vor ); folgende Zeilen einfügen, frei nach Doku (Link, Link):

'memcache.local' => '\OC\Memcache\APCu',
'enable_previews' => 'false',

Jetzt noch die Cronjobs bauen, einmal für www-data frei nach Doku (Link)

crontab -u www-data -e

hier 2, Nano wählen und folgende Zeile hinzufügen

*/15  *  *  *  * php -f /var/www/html/nextcloud/cron.php

und einmal für den normalen:

crontab -e

und mit 2 nano diese Zeile hinzufügen:

30 2 * * 1 /usr/bin/letsencrypt renew >> /var/log/le-renew.log

Anschließend ansurfen:

https://www.ssllabs.com/ssltest/analyze.html?d=<servername.domain.tld>&hideResults=on&latest

Sollte so aussehen:
bildschirmfoto-2016-09-20-um-10-21-25Freuen. Jetzt kannst Du Dir User für Dich und Deine Freunde anlegen.

Anmerkungen zu 10.0

Solltest Du intern, in dem Ding noch teilen wollen und die Version 10.0 noch 10.0 sein, so kannst Du bitte prüfen, ob

nano /var/www/html/nextcloud/apps/files_sharing/lib/sharedstorage.php

folgendem entspricht: Link

Sicherheit:

  • Wenn Du willst, kannst Du Deine Instanz noch weiter dicht machen – Hier gibt’s eine Anleitung dafür (Link).
  • Sascha Meinel wirft einen guten Tipp hinterher: Fail2Ban – Wie das geht, steht hier, bei Joachim Wilke: Link.

Das sollte es soweit sein.

Hinweis:

  • Nextcloud bietet einen Dienst an, welcher Deine Instanz auf korrekte Konfiguration hinsichtlich Sicherheit überprüfen kann. Du findest ihn hier: Link

Noch ein paar Gedanken zum Update:

Ich fand‘ die Dokumentation im Bereich Upgrade nicht wirklich hilfreich, da hier viel zwischen den einzelnen Distributionen gesprungen wird oder auf inoffizielles SNAP verwiesen wurde. Möglicherweise ist das ja auch schon korrigiert.

Nextcloud befindet sich bei mir in /var/www/html/nextcloud. Um es zu sichern, habe ich zunächst die Rechte des Verzeichnis übernommen:

chown root:root /var/www/html/nextcloud -R

Anschließend habe ich es umbenannt:

mv /var/www/html/nextcloud /var/www/html/ncold

Dann habe ich in /var/www/html die aktuelle NC-Version heruntergeladen und anschließend entpackt:

cd /var/www/html
wget https://download.nextcloud.com/server/releases/nextcloud-11.0.1.zip
unzip nextcloud-11.0.1.zip

Nextcloud entpackt nach /var/www/html/nextcloud. Mir fehlte noch meine Konfigurationsdatei, also habe ich die aus meiner alten Nextcloud-Sicherung geholt:

cp /var/www/html/ncold/config/config.php /var/www/html/nextcloud/config/config.php

Danach habe ich die Besitzrechte von /var/www/html/nextcloud wieder korrigiert:

chown www-data:www-data /var/www/html/nextcloud/ -R

Danach habe ich im Nextcloud-Verzeichnis unter dem www-data User das manuelle Update ausgeführt:

cd /var/www/html/nextcloud
sudo -u www-data php occ upgrade

Es hat nicht lange gedauert und das Update war durch:

Nextcloud or one of the apps require upgrade - only a limited number of commands are available
You may use your browser or the occ upgrade command to do the upgrade
Set log level to debug
Turned on maintenance mode
Updating database schema
Updated database
Updating <federatedfilesharing> ...
Updated <federatedfilesharing> to 1.1.1
Updating <files_pdfviewer> ...
Updated <files_pdfviewer> to 1.0.1
Updating <firstrunwizard> ...
Updated <firstrunwizard> to 2.0
Updating <password_policy> ...
Updated <password_policy> to 1.1.0
Updating <provisioning_api> ...
Updated <provisioning_api> to 1.1.0
Updating <updatenotification> ...
Updated <updatenotification> to 1.1.1
Updating <user_ldap> ...
Updated <user_ldap> to 1.1.1
Updating <files> ...
Updated <files> to 1.6.1
Updating <activity> ...
Updated <activity> to 2.4.1
Updating <dav> ...
Updated <dav> to 1.1.1
Updating <files_sharing> ...
Updated <files_sharing> to 1.1.1
Updating <files_trashbin> ...
Updated <files_trashbin> to 1.1.0
Updating <files_versions> ...
Updated <files_versions> to 1.4.0
Updating <workflowengine> ...
Updated <workflowengine> to 1.1.1
Updating <comments> ...
Updated <comments> to 1.1.0
Updating <notifications> ...
Updated <notifications> to 1.0.1
Updating <systemtags> ...
Updated <systemtags> to 1.1.3
Updating <theming> ...
Updated <theming> to 1.1.1
Drop old database tables

 Done
 31/31 [============================] 100%
Remove old (< 9.0) calendar/contact shares
 Done
 4/4 [============================] 100%
Fix permissions so avatars can be stored again
 Done
 2/2 [============================] 100%
Starting code integrity check...
Finished code integrity check
Update successful
Turned off maintenance mode
Reset log level

Nach einer  Prüfung habe ich die alte sicherung entfernt:

rm -rf /var/www/html/ncold

Also, alles doch recht simpel.