NextCloud auf einem nackten Ubuntu mit SSL installieren

Noch nie hatte ich eine so super gute Installations-Erfahrung mit Linux wie bei NextCloud:

  1. Nacktes EC2-Image mit Ubuntu 18.04 bei AWS klicken.
  2. ElasticIP holen und der Maschine zuweisen.
  3. Per SSH an der Maschine anmelden.
  4. sudo snap install nextcloud eingeben. Warten.

Installation fertig!

Optional, jetzt den Datenordner auf einen externen Ordner (z. B. zusätzliche Festplatte) zeigen lassen:

  1. sudo snap connect nextcloud:removable-media eingeben.
  2. Der Anleitung folgen (wichtig, es muss unterhalb von /media/ gemountet sein).

Dann einen Domain-Namen besorgen und per DNS-A-Record auf die Maschine zeigen lassen.

Jetzt noch SSL installieren:

  1. sudo ufw allow 80,443/tcp eingeben.
  2. sudo nextcloud.enable-https lets-encrypt eingeben.
  3. per Y zustimmen.
  4. E-Mail und Domain-Namen eingeben.

Installation fertig!

Anschließend einfach die Domain/URL im Browser aufrufen, und dem Assistent folgen.

(Bei meiner Installation hatte ich das SSL erst einen Tag später, als ich schon alles konfiguriert hatte, installiert, auch das ging problemlos).

Für SMTP habe ich mir ein kostenloses Konto bei Mailgun besorgt.

Um ein Update/Upgrade durchzuführen könnt Ihr folgenden Befehl auf der SSH-Shell auf dem Server nutzen:

sudo snap refresh nextcloud

Optional könnt Ihr noch einen Kanal über --channel=<Kanalname> angeben.

Um den Daten-Ordner auf dem Server auf eine andere Partition umzuziehen, gibt es hier eine Übersicht:

Und konkret mit snap geht es so wie hier beschrieben:

Bei mir war es eine zweite Festplatte, die ich bei AWS geklickt habe und dann wie in dieser Anleitung beschrieben gemountet habe.

Achtung, es muss nach sudo snap install nextcloud anschließend das hier eingegeben werden, so wie im README beschrieben:

sudo snap connect nextcloud:removable-media

Ansonsten schlägt der spätere Aufruf im Browser fehl.

Die „config.php“-Datei liegt bei mir im Ordner

/var/snap/nextcloud/current/nextcloud/config/config.php

(Quelle)

Andere Speicherorte, z. B. für die Apache-Logs (Protokolldateien) sind wie hier beschrieben:

Wenn AWS-EBS-Volumes für die Datenspeicherung zu teuer sind, geht auch, einen S3-Bucket als primären Datenspeicher zu konfigurieren.

Infos zur AWS-EC2-Instanzgröße:

Ich hatte zunächst einige Zeit lang die NextCloud-Installation mit „t2.small“ betrieben.

Leider gab es immer wieder mal Zeitüberschreitungen und insgesamt eine recht langsame GUI im Web-Backend.

Deshalb habe ich jetzt eins höher nach „t2.medium“ umgeschaltet.

Die ersten Tests lassen die Maschine und GUI jetzt deutlich flüssiger erscheinen. Mal schauen, ob das so bleibt.

Um große Dateien zu unterstützen, die Schritte durchführen, die im Handbuch beschrieben sind.

Da ich Snappy verwendet habe, können die Dateien nicht direkt bearbeitet werden, siehe z. B. hier:

Dort wird beschrieben, wie man auch bei Snap Konfigurationseinstellungen vornehmen kann:

sudo snap set nextcloud php.upload-max-filesize=500G

Das hat bei mir nicht geklappt bisher, ich habe eine Supportanfrage bei Nextcloud gestellt.

Zum Anwenden der geänderten Einstellungen entweder den Dienst neu starten:

sudo systemctl restart snap.nextcloud.apache

oder die ganze Maschine:

sudo reboot

Backups

Auch wenn meine eigentlichen Inhaltsdaten auf einem S3-Ordner liegen, und dort separat gesichert werden könnten, so will ich trotzdem die lokale Datenbank und die lokale Konfiguration sichern, schon auch deshalb, um überhaupt eine Zuordnung der Dateien im S3-Ordner zu den tatsächlichen Dateinamen und -Pfaden zu sichern.

Ich verwende Snappy, deshalb gilt hier diese Anleitung:

How to backup your instance

Die Anleitung im regulären Handbuch trifft auf Snappy so direkt wohl nicht zu.

Eine generelle Anleitung für ein Backup-Skript um nach AWS S3 zu sichern findet sich hier:

Dieses Skript passe ich mir ein bisschen an, um es anschließend als cronjob regelmäßig laufen zu lassen:

sudo crontab -e

und anschließend im Editor dann in die cron-Datei das hier einzufügen:

0 1 * * * /home/zeta/backup.sh > /home/zeta/backup.log 2>&1

Mein Backupskript selbst schaut dann grob so aus:

#!/bin/sh

# ----------

# https://www.ideyatech.com/creating-automated-backup-scripts-linux-s3/
# https://github.com/nextcloud/nextcloud-snap/wiki/How-to-backup-your-instance

# sudo crontab -e
# 0 1 * * * /home/zeta/backup.sh > /home/zeta/backup.log 2>&1
# <RETURN-Taste!>

echo '----------------------------------'
echo 'started'
echo ' '

# backup folder within the server where backup files are store
BAK_DEST=/tmp/backup

# Wo Nextcloud sein Backup speichert. Inhalte werden von diesem Skript 
# vorher gelöscht.
NEXTCLOUD_BACKUP_SOURCE=/var/snap/nextcloud/common/backups

# folders for backup, can be comma separated for multiple folders
BAK_SOURCES=$NEXTCLOUD_BACKUP_SOURCE,/var/zeta

# API Keys for S3
export AWS_ACCESS_KEY_ID="*** REMOVED ***"
export AWS_SECRET_ACCESS_KEY="*** REMOVED ***"

#s3 bucket name that contains backup
S3_BUCKET=my-bucket-name/my-folder-in-the-bucket

#number of days to keep archives
KEEP_DAYS=3

# ----------

#script variables
BAK_DATE=`date +%F`
BAK_DATETIME=`date +%F-%H%M`
BAK_FOLDER=${BAK_DEST}/${BAK_DATE}
DAYOFYEAR=`date +%j`
DAYOFYEARINT=$(echo $DAYOFYEAR | sed 's/^0*//')
MYIDX=$(($DAYOFYEARINT % $KEEP_DAYS))
ROLLING_FOLDER=backup-${MYIDX}

## echo 'DOY: ' ${DAYOFYEAR}
## echo 'DOYI: ' ${DAYOFYEARINT}
## echo 'Index : ' ${MYIDX}
## echo 'Ordnername: ' ${ROLLING_FOLDER}
## exit 1


# CREATE folder where backup database is to be place
echo 'Creating temp local backup to folder ' ${BAK_FOLDER}
rm -f -R ${BAK_FOLDER}
mkdir -p ${BAK_FOLDER}

# ---------

# Löschen des aktuellen Tagesordners.
echo 'Removing current day folder on S3'
# "which aws" gibt auf der Konsole den Pfad aus.
/usr/bin/aws s3 rm s3://${S3_BUCKET}/${ROLLING_FOLDER} --recursive

# Löschen des lokalen Nextcloud-Backup-Ziels.
# Nextcloud-Export wird dann dahinein etwas schreiben.
rm -rfv $NEXTCLOUD_BACKUP_SOURCE/*

# Nextcloud-Backup aufrufen.
/snap/bin/nextcloud.export -abc

# ---------

echo 'Archiving folders'

FOLDERS=$(echo $BAK_SOURCES | tr "," "\n")
i=0
for F in $FOLDERS
do
  echo ' '
  echo 'Archiving ' ${F} '...'
  i=`expr ${i} + 1`

  tar czPf ${BAK_FOLDER}/FILE_${i}_${BAK_DATETIME}.tar.gz ${F}
  echo 'Created tar file ' ${BAK_FOLDER}/FILE_${i}_${BAK_DATETIME}.tar.gz

  # "which aws" gibt auf der Konsole den Pfad an.
  /usr/bin/aws s3 cp ${BAK_FOLDER}/FILE_${i}_${BAK_DATETIME}.tar.gz s3://${S3_BUCKET}/${ROLLING_FOLDER}/FILE_${i}_${BAK_DATETIME}.tar.gz --storage-class REDUCED_REDUNDANCY
done

echo 'Deleting temp local backup folder ' ${BAK_FOLDER}
rm -f -R ${BAK_FOLDER}

echo ' '
echo 'finished'
echo '----------------------------------'