Build your Nextcloud 14 Server using one shell script


The initial script (install-nextcloud.sh) will install your self hosted Nextcloud within few minutes fully automated. Your server will be built of:

  • Fail2Ban (Nextcloud and SSH jails)
  • MariaDB 10.3.9
  • Nextcloud 14
  • NGINX 1.15.3
  • OpenSSL 1.1.0
  • PHP 7.2.10
  • Redis-Server
  • self signed or Let’s Encrypt SSL using the second script
  • UFW (22, 80, 443)

The only precondition for the install-nextcloud.sh script is to utilize Ubuntu 18.04 LTS as your on-prem server OS. Optionally request your ssl certificate from Let’s Encrypt by issuing the second script called “ssl-certificate.sh”.

Beyond that you will find additional scripts at /usr/local/src/install-nextcloud/

  • fail2ban.sh
  • optimize.sh
  • restart.sh
  • ssl-renewal.sh

to optimize and maintain your system easily. Ready to go? Let’s start:


(1) Build your self hosted Nextcloud server

If you are on Ubuntu 18.04 LTS:

sudo -s
apt install git -y
cd /usr/local/src
git clone https://github.com/riegercloud/install-nextcloud.git
cd install-nextcloud
chmod +x *.sh
./install-nextcloud.sh

… be patient

Press ENTER to continue with the MariaDB installation and press ENTER again (without setting a MariaDB root password) if the magenta screen appears (3x). As described you will be asked to set/change the MariaDB root password while running mysql_secure_installation, at this step it is highly recommended to set the root password.

… be patient

Open your browser and call the shown URL from your shell

Nextcloud is already up, optimized and running!


(2) Optionally: Request your ssl certificate from Let’s Encrypt

Before you request your certificate ensure that your web-ports (80+443) are forwared to your server and your dyndns is properly configured to point to your server!

sudo -s
/usr/local/src/install-nextcloud/ssl-certificate.sh

You only have to enter your DYNDNSNAME (YOUR.DEDYN.IO).

Then LetsEncrypt will ask you for

  • your email adress
Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel):
  • to agree to their Terms of Service
A

and finally

  • if you are willing to share your email address with the Electronic Frontier Foundation
Y or N

Wait while your certificates are obtained.

If you receive this message:

++++++++++++++++++++++++++++++++++++++++++++++++++++

Call: https://your.dedyn.io and enjoy your Nextcloud

++++++++++++++++++++++++++++++++++++++++++++++++++++

your server is up and running using a verified certificate from Let’s Encrypt.


(3) Additional scripts

You will find additional scripts

  • /usr/local/src/install-nextcloud/fail2ban.sh

  • /usr/local/src/install-nextcloud/optimize.sh

  • /usr/local/src/install-nextcloud/restart.sh
    restart all Nextcloud related services
  • /usr/local/src/install-nextcloud/ssl-renewal.sh
    try to renew your ssl certificates

to optimize and maintain your system easily.


Enjoy your personal data in your secured and hardened Nextcloud.

Don’t forget to backup your Nextcloud

Find more instructions here: Nextcloud Backup and Restore



Carsten Rieger

89 Responses

  1. Ruben says:

    Thank You !!!
    it works perfectly.

  2. strobo says:

    hi Christian
    sehr schönes tutorial. hat sehr gut funktioniert.
    eine Frage steht aber noch im Raum.
    im nextcloud backend als Admin erhalte ich die Meldung: bei der code integritätsprüfung sind probleme aufgetreten
    wenn man da drauf geht ->
    Es gibt einige Fehler bei Ihrer Systemkonfiguration.
    Einige Dateien haben die Integritätsprüfung nicht bestanden. Weiterführende Informationen befinden sich in unserer Dokumentation. (Liste der ungültigen Dateien … / Erneut analysieren…)
    Die Verwendung des eingebauten PHP-Mailers wird nicht länger unterstützt. Bitte aktualisieren Sie die E-Mail-Server-Einstellungen ↗.

    -> Liste der ungültigen Dateien
    Results
    =======
    – core
    – INVALID_HASH
    – .user.ini

    Raw output
    ==========
    Array
    (
    [core] => Array
    (
    [INVALID_HASH] => Array
    (
    [.user.ini] => Array
    (
    [expected] => 467d4f028c447895716a2b7859ed6e569f8ee34b87b51d73dab2e6a9ca4fbe63172c7be3e365ae864a60408286afcce852dd38ee544b61685ed4ee5e021fecb0
    [current] => d71945d913c9c3f3a9b7ad8d240690f566e1066cec057956a4b484c99f1298d49896313e5c0b5c1b1b5fd9c8f6a100a5959fa083fbae67761493e36557a3644a
    )

    )

    )

    )

    hast du eine Idee? und wie kriege ich die Meldung mit dem Email weg?

  3. Felix says:

    Hallo, vielen Dank für dieses super Script!
    Allerdings noch eine Frage zum Let’s Encrypt Zertifikat.
    In deinem Beispiel muss man die gewünschte Domain (z.B. your.dedyn.io) im Konsolenfenster eingeben, worauf dann das Zertifikat abgerufen wird. Was aber wenn ich mehr als eine Domain auf die IP-Adresse eingerichtet habe und für alle ein SSL-Zertifikat abrufen möchte. Gibt es da eine Möglichkeit an dieser Stelle mehr als eine Domain einzutragen z.B. getrennt durch , ; oder : ?

    • Vielleicht meinst Du das? letsencrypt certonly -a webroot --webroot-path=/var/www/letsencrypt --rsa-key-size 4096 -d YOUR1.DEDYN.IO -d YOUR2.DEDYN.IO -d YOUR3.DEDYN.IO. Somit würde ein Zertifikat mit verschiedenen SANs erzeugt.
      Ansonsten kannst Du mittels NGINX und SNIs verschiedene Domänen einrichten und für jede Domäne (SNI) ein Zertifikat in einer eigenen ssl.conf hinterlegen.

  4. Martin says:

    Hallo Carsten,
    erstmal Danke für das Script – sehr beeindruckend!
    Ich habe Testweise eine Nextcloud 14.0.0 auf einer VM mit deinem Script installiert.
    Wenn ich unter Win7 mit dem Client (2.3.3.1) größere Mengen an Dateien hochlade im lokalen Netz werden Fehler ausgeworfen (im Client). Unten dazu die Fatal-Meldung aus dem NC-Admin Protokoll.
    In der nächsten Runde wird der Fehler korrigiert, aber schön ist das nicht.

    Hast du eine Idee?

    Danke & viele Grüße
    Martin

    Fatal webdav
    Doctrine\DBAL\Exception\DriverException: An exception occurred while executing ‘INSERT INTO `oc_filecache` (`mimepart`,`mimetype`,`mtime`,`size`,`etag`,`storage_mtime`,`permissions`,`parent`,`checksum`,`path_hash`,`path`,`name`,`storage`) SELECT ?,?,?,?,?,?,?,?,?,?,?,?,? FROM `oc_filecache` WHERE `storage` = ? AND `path_hash` = ? HAVING COUNT(*) = 0’ with params [“8”, “14”, 1536762670, 67190, “22b7abe1fd6a75be6532dec98a3ac458”, 1536762670, 27, 1030, “”, “9862d3623800ee913bac0ec660fcb291”, “files\/test\/inf\/usbport.inf”, “usbport.inf”, 3, 3, “9862d3623800ee913bac0ec660fcb291”]: SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction

    /var/www/nextcloud/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php – line 128:

    Doctrine\DBAL\Driver\AbstractMySQLDriver->convertException(“An exceptio … n”, Doctrine\DBA … ]})

    /var/www/nextcloud/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Connection.php – line 1015:

    Doctrine\DBAL\DBALException::driverExceptionDuringQuery(Doctrine\DBA … {}, Doctrine\DBA … ]}, “INSERT INTO … 0”, { 1: “8”,2: … “})

    /var/www/nextcloud/lib/private/DB/Connection.php – line 216:

    Doctrine\DBAL\Connection->executeUpdate(“INSERT INTO … 0”, [ “8”,”14″,1 … “], [])

    /var/www/nextcloud/lib/private/DB/Adapter.php – line 114:

    OC\DB\Connection->executeUpdate(“INSERT INTO … 0”, [ “8”,”14″,1 … “])

    /var/www/nextcloud/lib/private/DB/Connection.php – line 254:

    OC\DB\Adapter->insertIfNotExist(“*PREFIX*filecache”, { mimepart: … 3}, [ “storage”,”path_hash”])

    /var/www/nextcloud/lib/private/Files/Cache/Cache.php – line 272:

    OC\DB\Connection->insertIfNotExist(“*PREFIX*filecache”, { mimepart: … 3}, [ “storage”,”path_hash”])

    /var/www/nextcloud/lib/private/Files/Cache/Cache.php – line 229:

    OC\Files\Cache\Cache->insert(“files/test/inf/usbport.inf”, { mimetype: … “})

    /var/www/nextcloud/lib/private/Files/Cache/Scanner.php – line 292:

    OC\Files\Cache\Cache->put(“files/test/inf/usbport.inf”, { mimetype: … “})

    /var/www/nextcloud/lib/private/Files/Cache/Scanner.php – line 221:

    OC\Files\Cache\Scanner->addToCache(“files/test/inf/usbport.inf”, { mimetype: … “}, -1)

    /var/www/nextcloud/lib/private/Files/Cache/Scanner.php – line 336:

    OC\Files\Cache\Scanner->scanFile(“files/test/inf/usbport.inf”, 3, 1030, false, false)

    /var/www/nextcloud/lib/private/Files/Cache/Updater.php – line 124:

    OC\Files\Cache\Scanner->scan(“files/test/inf/usbport.inf”, false, 3, false)

    /var/www/nextcloud/apps/dav/lib/Connector/Sabre/File.php – line 235:

    OC\Files\Cache\Updater->update(“files/test/inf/usbport.inf”)

    /var/www/nextcloud/apps/dav/lib/Connector/Sabre/Directory.php – line 156:

    OCA\DAV\Connector\Sabre\File->put(null)

    /var/www/nextcloud/3rdparty/sabre/dav/lib/DAV/Server.php – line 1096:

    OCA\DAV\Connector\Sabre\Directory->createFile(“usbport.inf”, null)

    /var/www/nextcloud/3rdparty/sabre/dav/lib/DAV/CorePlugin.php – line 529:

    Sabre\DAV\Server->createFile(“files/marti … f”, null, null)

    Sabre\DAV\CorePlugin->httpPut(Sabre\HTTP\R … “}, Sabre\HTTP\Response {})

    /var/www/nextcloud/3rdparty/sabre/event/lib/EventEmitterTrait.php – line 105:

    call_user_func_array([ Sabre\DAV\ … “], [ Sabre\HTTP … }])

    /var/www/nextcloud/3rdparty/sabre/dav/lib/DAV/Server.php – line 479:

    Sabre\Event\EventEmitter->emit(“method:PUT”, [ Sabre\HTTP … }])

    /var/www/nextcloud/3rdparty/sabre/dav/lib/DAV/Server.php – line 254:

    Sabre\DAV\Server->invokeMethod(Sabre\HTTP\R … “}, Sabre\HTTP\Response {})

    /var/www/nextcloud/apps/dav/lib/Server.php – line 293:

    Sabre\DAV\Server->exec()

    /var/www/nextcloud/apps/dav/appinfo/v2/remote.php – line 35:

    OCA\DAV\Server->exec()

    /var/www/nextcloud/remote.php – line 163:

    require_once(“/var/www/ne … p”)

    Eingefasst vonDoctrine\DBAL\Driver\PDOException: SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction

    /var/www/nextcloud/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Connection.php – line 1008:

    Doctrine\DBAL\Driver\PDOStatement->execute([ “8”,”14″,1 … “])

    /var/www/nextcloud/lib/private/DB/Connection.php – line 216:

    Doctrine\DBAL\Connection->executeUpdate(“INSERT INTO … 0”, [ “8”,”14″,1 … “], [])

    /var/www/nextcloud/lib/private/DB/Adapter.php – line 114:

    OC\DB\Connection->executeUpdate(“INSERT INTO … 0”, [ “8”,”14″,1 … “])

    /var/www/nextcloud/lib/private/DB/Connection.php – line 254:

    OC\DB\Adapter->insertIfNotExist(“*PREFIX*filecache”, { mimepart: … 3}, [ “storage”,”path_hash”])

    /var/www/nextcloud/lib/private/Files/Cache/Cache.php – line 272:

    OC\DB\Connection->insertIfNotExist(“*PREFIX*filecache”, { mimepart: … 3}, [ “storage”,”path_hash”])

    /var/www/nextcloud/lib/private/Files/Cache/Cache.php – line 229:

    OC\Files\Cache\Cache->insert(“files/test/inf/usbport.inf”, { mimetype: … “})

    /var/www/nextcloud/lib/private/Files/Cache/Scanner.php – line 292:

    OC\Files\Cache\Cache->put(“files/test/inf/usbport.inf”, { mimetype: … “})

    /var/www/nextcloud/lib/private/Files/Cache/Scanner.php – line 221:

    OC\Files\Cache\Scanner->addToCache(“files/test/inf/usbport.inf”, { mimetype: … “}, -1)

    /var/www/nextcloud/lib/private/Files/Cache/Scanner.php – line 336:

    OC\Files\Cache\Scanner->scanFile(“files/test/inf/usbport.inf”, 3, 1030, false, false)

    /var/www/nextcloud/lib/private/Files/Cache/Updater.php – line 124:

    OC\Files\Cache\Scanner->scan(“files/test/inf/usbport.inf”, false, 3, false)

    /var/www/nextcloud/apps/dav/lib/Connector/Sabre/File.php – line 235:

    OC\Files\Cache\Updater->update(“files/test/inf/usbport.inf”)

    /var/www/nextcloud/apps/dav/lib/Connector/Sabre/Directory.php – line 156:

    OCA\DAV\Connector\Sabre\File->put(null)

    /var/www/nextcloud/3rdparty/sabre/dav/lib/DAV/Server.php – line 1096:

    OCA\DAV\Connector\Sabre\Directory->createFile(“usbport.inf”, null)

    /var/www/nextcloud/3rdparty/sabre/dav/lib/DAV/CorePlugin.php – line 529:

    Sabre\DAV\Server->createFile(“files/marti … f”, null, null)

    Sabre\DAV\CorePlugin->httpPut(Sabre\HTTP\R … “}, Sabre\HTTP\Response {})

    /var/www/nextcloud/3rdparty/sabre/event/lib/EventEmitterTrait.php – line 105:

    call_user_func_array([ Sabre\DAV\ … “], [ Sabre\HTTP … }])

    /var/www/nextcloud/3rdparty/sabre/dav/lib/DAV/Server.php – line 479:

    Sabre\Event\EventEmitter->emit(“method:PUT”, [ Sabre\HTTP … }])

    /var/www/nextcloud/3rdparty/sabre/dav/lib/DAV/Server.php – line 254:

    Sabre\DAV\Server->invokeMethod(Sabre\HTTP\R … “}, Sabre\HTTP\Response {})

    /var/www/nextcloud/apps/dav/lib/Server.php – line 293:

    Sabre\DAV\Server->exec()

    /var/www/nextcloud/apps/dav/appinfo/v2/remote.php – line 35:

    OCA\DAV\Server->exec()

    /var/www/nextcloud/remote.php – line 163:

    require_once(“/var/www/ne … p”)

    Eingefasst vonPDOException: SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction

    /var/www/nextcloud/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php – line 105:

    PDOStatement->execute([ “8”,”14″,1 … “])

    /var/www/nextcloud/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Connection.php – line 1008:

    Doctrine\DBAL\Driver\PDOStatement->execute([ “8”,”14″,1 … “])

    /var/www/nextcloud/lib/private/DB/Connection.php – line 216:

    Doctrine\DBAL\Connection->executeUpdate(“INSERT INTO … 0”, [ “8”,”14″,1 … “], [])

    /var/www/nextcloud/lib/private/DB/Adapter.php – line 114:

    OC\DB\Connection->executeUpdate(“INSERT INTO … 0”, [ “8”,”14″,1 … “])

    /var/www/nextcloud/lib/private/DB/Connection.php – line 254:

    OC\DB\Adapter->insertIfNotExist(“*PREFIX*filecache”, { mimepart: … 3}, [ “storage”,”path_hash”])

    /var/www/nextcloud/lib/private/Files/Cache/Cache.php – line 272:

    OC\DB\Connection->insertIfNotExist(“*PREFIX*filecache”, { mimepart: … 3}, [ “storage”,”path_hash”])

    /var/www/nextcloud/lib/private/Files/Cache/Cache.php – line 229:

    OC\Files\Cache\Cache->insert(“files/test/inf/usbport.inf”, { mimetype: … “})

    /var/www/nextcloud/lib/private/Files/Cache/Scanner.php – line 292:

    OC\Files\Cache\Cache->put(“files/test/inf/usbport.inf”, { mimetype: … “})

    /var/www/nextcloud/lib/private/Files/Cache/Scanner.php – line 221:

    OC\Files\Cache\Scanner->addToCache(“files/test/inf/usbport.inf”, { mimetype: … “}, -1)

    /var/www/nextcloud/lib/private/Files/Cache/Scanner.php – line 336:

    OC\Files\Cache\Scanner->scanFile(“files/test/inf/usbport.inf”, 3, 1030, false, false)

    /var/www/nextcloud/lib/private/Files/Cache/Updater.php – line 124:

    OC\Files\Cache\Scanner->scan(“files/test/inf/usbport.inf”, false, 3, false)

    /var/www/nextcloud/apps/dav/lib/Connector/Sabre/File.php – line 235:

    OC\Files\Cache\Updater->update(“files/test/inf/usbport.inf”)

    /var/www/nextcloud/apps/dav/lib/Connector/Sabre/Directory.php – line 156:

    OCA\DAV\Connector\Sabre\File->put(null)

    /var/www/nextcloud/3rdparty/sabre/dav/lib/DAV/Server.php – line 1096:

    OCA\DAV\Connector\Sabre\Directory->createFile(“usbport.inf”, null)

    /var/www/nextcloud/3rdparty/sabre/dav/lib/DAV/CorePlugin.php – line 529:

    Sabre\DAV\Server->createFile(“files/marti … f”, null, null)

    Sabre\DAV\CorePlugin->httpPut(Sabre\HTTP\R … “}, Sabre\HTTP\Response {})

    /var/www/nextcloud/3rdparty/sabre/event/lib/EventEmitterTrait.php – line 105:

    call_user_func_array([ Sabre\DAV\ … “], [ Sabre\HTTP … }])

    /var/www/nextcloud/3rdparty/sabre/dav/lib/DAV/Server.php – line 479:

    Sabre\Event\EventEmitter->emit(“method:PUT”, [ Sabre\HTTP … }])

    /var/www/nextcloud/3rdparty/sabre/dav/lib/DAV/Server.php – line 254:

    Sabre\DAV\Server->invokeMethod(Sabre\HTTP\R … “}, Sabre\HTTP\Response {})

    /var/www/nextcloud/apps/dav/lib/Server.php – line 293:

    Sabre\DAV\Server->exec()

    /var/www/nextcloud/apps/dav/appinfo/v2/remote.php – line 35:

    OCA\DAV\Server->exec()

    /var/www/nextcloud/remote.php – line 163:

    require_once(“/var/www/ne … p”)

  5. DFFVB says:

    If I wouldn’t have donated already, I would now!!!

  6. Albrecht Eissler says:

    Geiles Teil! Danke!
    Sollte das Skript auch auf dem Odroid C2 funktionieren, in der ARM64-Variante natürlich? Ich bin nicht durchgekommen damit. Die Abfragen bei der Installation der MariaDB kommen nicht, es gibt einige Fehlermeldungen und am Ende komme ich nicht auf das Web-Interface. Grundlage war das Ubuntu-Minimal-Image aus der Installationsbeschreibung “ODROID-C2 from scratch (Ubuntu 18.04)”.

    • Vielen Dank. Ja, sollte funktionieren. War der DB-Server schon vorhanden? Was lief denn schief? Ich werde es in Kürze testen und gebe dann Feedback. Ciao, Carsten

      • Albrecht Eißler says:

        Nach der Abfrage, ob die MariaDB installiert werden soll,will das Skript Nextcloud DB-Username und -Passwort wissen. Ich habe auf’s Geratewohl “nextcloud” und “nextcloud” angegeben.
        Dann folgt die Fehlermeldung, dass der mysql sercive nicht neu gestartet werden konnte mit der Begründung “Unit mysql service not found”.
        Direkt danach kommt: ./install-nextcloudARM64.sh: Zeile 337: mysql_secure_installation: Befehl nicht gefunden
        Danach kommt mehrmals “Nextcloud is not installed – only a limited number of commands are available”.
        Schließlich kommt “Job for nginx.service failed because the control process exited with error code.”
        Der Status der laufenden Dienste sieht so aus:
        “sudo service –status-all
        [ – ] console-setup.sh
        [ + ] cron
        [ + ] dbus
        [ + ] fail2ban
        [ – ] hwclock.sh
        [ – ] keyboard-setup.sh
        [ + ] kmod
        [ + ] network-manager
        [ – ] nginx
        [ + ] php7.2-fpm
        [ – ] pppd-dns
        [ + ] procps
        [ + ] redis-server
        [ + ] rsyslog
        [ – ] screen-cleanup
        [ + ] ssh
        [ + ] udev
        [ + ] ufw
        [ + ] unattended-upgrades
        [ – ] x11-common”

  7. Simon says:

    Nach der Installation liegt unter /var/www/nextcloud eine Datei mit dem namen .user.ini.bak
    Die datei gehört nicht dem www-data user und verhindert ein NC Update über die Weboberfläche.

    -rw-r–r– 1 root root 163 Aug 29 13:43 .user.ini.bak

  8. Tuan Nguyen says:

    Hello sir.
    First, thank you so much.
    Then, please help me:

    My Windows PC: I edit Registry FileSizeLimitInBytes 999999999: https://snag.gy/bTL7nC.jpg

    I run your scrip on Ubuntu 64 18.04.1 server with your scrip origin , no config anything. NC run smooth. Upload big file > 4GB via web browser success (in my case file > 9GB via Chrome).

    ===

    When I upload file about 1G via webdav File Windows Explore => upload success:

    https://snag.gy/BQYIpq.jpg
    https://snag.gy/lin5Tx.jpg
    https://snag.gy/qhlFJL.jpg

    But with file > 4GB via webdav File Windows Explore => upload no success. (it upload 2 time by itself with no success):

    https://snag.gy/cpNw9y.jpg
    https://snag.gy/J4W0Xv.jpg
    https://snag.gy/Ss0KXy.jpg
    https://snag.gy/LomI9x.jpg

    Please help me fix it. Thank you so much.

  9. Franz says:

    Hallo Carsten,
    geniales script, Danke fürs Teilen! Google Chrome zeigt mir meine Nextcloud Seiten als “schädlich” an, trotz korrekt ausgestelltem LetsEncrypt Zertifikat. Woran liegt’s und was kann man tun damit das wieder sauber ist?
    Danke Dir, Franz

  10. Carlton Brooks says:

    Yes it should say 443.
    Ran what you suggested, all came back as active running.
    Did a reboot and same thing.
    If I reinstall what should I look for.

  11. Carlton Brooks says:

    Thank you for this. I have used your other tutorials to set up version 12. Server died so I figured I would start from scratch.
    Followed the directions and install seemed to go with no errors. DID NOT INSTALL STEP 2 ON SSL (YET)
    Nmap says ports 442 and 80 are open ufw status is good as well.
    But… it will not open using the https address. used my ip address 192.168.1.129 and chrome says
    This site can’t be reached
    192.168.1.129 refused to connect.
    Check usual stuff but what else in your code should I check.
    Thank you

    • Check wether all services are started properly?
      service nginx status
      service php7.2-fpm status
      servis redis-server status
      service mysql status

      I guess you meant port 443 instead of 442?!

  12. Mike says:

    Hallo Carsten, besten Dank für das Script, es hat auf Anhieb funktioniert.
    Kannst du mir sagen, wie ich die Konfiguration von nginx ändern muss, damit ich noch eine zweite Seite drauf betreiben kann? Ich denke mal ich muss die nextcloud.conf editieren … Habe schon alles versucht er leitet immer auf die Nextcloud um.

  13. Axel says:

    Hallo Carsten, vielen Dank für das super Skript!

    Auf meinem Ubuntu 18.04 hat die Installation super funktioniert, inkl. SSL Zertifikat.

    Dann wollte ich die Nginx Konfiguration anpassen, um NC über ein Unterverzeichnis erreichbar zu machen und bin dabei deiner Anleitung gefolgt.

    Jetzt habe ich das Problem, dass der Webserver nur noch von außen erreichbar ist! Ich kann z.B. scan.nextcloud.com oder auch ssllabs.com das System prüfen lassen und auch vom Handy über das Mobilfunknetz zugreifen, aber aus meinem LAN geht es nicht, es kommt nichts beim Server an, dementsprechend steht auch nichts in den Logs.

    Woran kann das liegen? Bin ziemlich ratlos. :-((

    • Hi Axel, rufe doch mal fail2ban-client status nextcloud auf. Bist Du evtl. gesperrt. Laufen NGINX, PHP, Redis und auch MariaDB…?

      • Axel says:

        Hi! Danke für Deine Antwort.

        Das wird es wahrscheinlich gewesen sein, ich hab es gestern abend nicht mehr probiert, aber heute morgen hat es wieder funktioniert. Klingt ja nach Zeitablauf bei Fail2Ban! Sorry!

        Fail2Ban hatte ich gar nicht auf dem Schirm, weil ich ja mit Deinem Skript installiert habe. Hat also alles Vor- und Nachteile! ;-))

  14. Kees van Leeuwen says:

    Karsten, thanks for the script. I still found some instabillity so i downloaded and read the script. A nice and wel documented scrpt. I changed the location of the jail log script to /var/log/nextcloud.conf but i also found that you installed a lot of php on row 98 but you had left out php7.2 itstelf. I added that also, did a fresh instal, let the script run and ended with a working setup without any of the earlier problems.

    • Hi Kees, PHP will be installed by issuing row 98. Nevertheless, thank you for your information and enjoy your Nextcloud. Cheers, Carsten

      • Kees says:

        Hi Carsten, this “php7.2” is not on line 98. I searched for it and added a space and a p in the search term. Yes search for “php7.2 p” and it does not show up. Because it is also not the last item on the line it really is not in the script.

        I also have an msql error log with a lot of error, but I did not notice anything on the app itself.
        I digged in the my.cnf setting and I noticed that did not setup “binary logging” completely. I found only “binlog_format = mixed” but I missed the other two statements

        log-bin = /var/log/mysql/mariadb-bin
        log-bin-index = /var/log/mysql/mariadb-bin.index
        binlog_format = mixed

        Cheers, Kees

        • It is not mentioned explicitly but will be installed by the php statement in the script. I did never need your maria-db log-bin entries in the past but am not a MariaDB expert.

          • Kees says:

            Hi Carsten, Earlier after my first installation i got an internal server 500 problem with to original script, it took some time after installation but then the problem seemed to matured. When i discovered that php7.0 was missing in a new install, i decided to test it directly after the initial installation. I also tought that it was probably installed as a depency and that it should be there, so i was amazed that that was not the case. When i installed it it proved to be an new additional instalation of this php7.0 but i also did not encounter the earlier setup problems so i found it significant enough to report it. So far the setup runs well, i inspected and tested it but i only did one extra reset.

            Later i discovered a larger then usual error log at the db and i noticed the missing 2 binlog statements. Adding these statements and a reboot did stop the extra logging ((i also created two empty log files be touching them) so i think that i can disregard the earlier part of the log. The database is installed “to speed things up” but if the logging is problematic it will slow everithing down. The reversal from wahat was intended.

            Sorry for being a bit of a nuiseance but i only informed you because i respect the effort you put this setup. I also considered an installation with snap or a docker seetup but the script is working quickly which enabled me to dig sowhat around. ( i found another typo at the creation of the db. a missing space, it states “uroot” where it should be “u root” but that didnt stop the actual creation of the db.)

            Cheers, Kees

  15. Predrag says:

    Hallo Carsten,

    erst einmal ein ganz großes Lob für Deine tolle Arbeit und für Deine Mühe die Du Dir mit den Anleitungen gemacht hast. Die Zeit und der Aufwand sind nicht zu unterschätzen. Vielen Dank hierfür!

    Ich habe Dein Script auch schon angewendet und alles funktionierte fehlerfrei. Leider kann ich das von dem zweiten Script (ssl-certificate.sh), nicht behaupten. Nach dem anwenden des zweiten Scripts, dass scheinbar ohne Fehler durchlief, war meine Nextcloud Installation nicht mehr aufrufbar. Weder intern noch extern. Nur eine weiße Seite. Nach Prüfung der config.php stellte ich fest, dass der Domain Name auf “YOUR.DEDYN.IO” geändert wurde. Wie kann das sein?

    Meine zweite Frage wäre, was muss ich tun um das Script so anzupassen, dass die Installation über eine “subdir” aufrufbar ist? Zudem möchte ich gerne PostgreSQL als DB einsetzen. Wie ist Deine Meinung dazu? Was müsste ich dabei beachten?

    Vielen Dank für Deine Mühe!

    Gruß
    Predrag

  16. Perry Clements says:

    Fantastic work!

    I installed the first script into on fresh 1804 ubuntu server (no graphics) running in a VM under KVM/Qemu, 1604LTS host.

    Everything worked until I added a trusted domain for a local computer, then port 80 and 443 closed.

    This is the command I used to add the trusted domain:

    perry@nc1:~$ sudo -u www-data php /var/www/nextcloud/occ config:system:set trusted_domains 1 –value=G75VW.local
    System config value trusted_domains => 1 set to string G75VW.local

    perry@nc1:~$ sudo -u www-data php /var/www/nextcloud/occ config:system:get trusted_domains
    nc1
    G75VW.local

    The trusted domain seem to add ok but port 80 and 443 closed.

    Any ideas why or hints to troubleshoot?

    • To be honest, no. Sure your ports were closed?! ufw status verbose or netstat -ant | egrep '(:80|:443) .*:.*ESTABLISHED' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c

      • Perry Clements says:

        The ports looks open when I run ufw from inside using SSH but they looked closed from the outside using nmap and the website stops responding after the trusted domain is added.

        Before adding the trusted domain…

        perry@nc1:~$ sudo ufw status verbose
        Status: active
        Logging: on (medium)
        Default: deny (incoming), allow (outgoing), disabled (routed)
        New profiles: skip

        To Action From
        — —— —-
        80/tcp ALLOW IN Anywhere
        443/tcp ALLOW IN Anywhere
        22/tcp ALLOW IN Anywhere
        80/tcp (v6) ALLOW IN Anywhere (v6)
        443/tcp (v6) ALLOW IN Anywhere (v6)
        22/tcp (v6) ALLOW IN Anywhere (v6

        perry@G75VW:~$ nmap 192.168.0.94
        Starting Nmap 7.70 ( https://nmap.org ) at 2018-05-23 12:42 ADT
        Nmap scan report for 192.168.0.94
        Host is up (0.00077s latency).
        Not shown: 997 filtered ports
        PORT STATE SERVICE
        22/tcp open ssh
        80/tcp open http
        443/tcp open https

        Added the trusted domain here…

        perry@G75VW:~$ nmap 192.168.0.94
        Starting Nmap 7.70 ( https://nmap.org ) at 2018-05-23 12:48 ADT
        Nmap scan report for 192.168.0.94
        Host is up (0.00085s latency).
        Not shown: 997 filtered ports
        PORT STATE SERVICE
        22/tcp open ssh
        80/tcp closed http
        443/tcp closed https

        perry@nc1:~$ sudo ufw status verbose
        Status: active
        Logging: on (medium)
        Default: deny (incoming), allow (outgoing), disabled (routed)
        New profiles: skip

        To Action From
        — —— —-
        80/tcp ALLOW IN Anywhere
        443/tcp ALLOW IN Anywhere
        22/tcp ALLOW IN Anywhere
        80/tcp (v6) ALLOW IN Anywhere (v6)
        443/tcp (v6) ALLOW IN Anywhere (v6)
        22/tcp (v6) ALLOW IN Anywhere (v6

        • Perry Clements says:

          Looks like fail2ban was the problem. I unbaned the IP and things are now working.

          2018-05-23 15:36:41,013 fail2ban.jail [1179]: INFO Jail ‘sshd’ started
          2018-05-23 15:36:41,014 fail2ban.jail [1179]: INFO Jail ‘nextcloud’ started
          2018-05-23 15:41:50,470 fail2ban.filter [1179]: INFO [nextcloud] Found 192.168.0.50 – 2018-05-23 15:41:50
          2018-05-23 15:41:50,868 fail2ban.filter [1179]: INFO [nextcloud] Found 192.168.0.50 – 2018-05-23 15:41:50
          2018-05-23 15:46:15,225 fail2ban.filter [1179]: INFO [nextcloud] Found 192.168.0.50 – 2018-05-23 15:46:14
          2018-05-23 15:46:15,791 fail2ban.actions [1179]: NOTICE [nextcloud] Ban 192.168.0.50

  17. Mateusz says:

    Hey Carsten. First of all great work, though I cannot seem to get it to work (PINE64+ board with Ubuntu Xenial Minimal installed) as the browser returns an error (Unsecure connection).
    Referring to the problem above I came up with a suggestion. Are you keen on developing a remove shell script for the whole install? I think it would help many.
    Cheers.

    • No i won’t. But what is your problem in detail? Did you issue the second script or only the first? what errors were written in the log-files (e.g. nginx or letsencrypt or nextcloud.log) Please send me an emal with further informaion i will try to help you. OK? Cheers, Carsten

  18. Zane says:

    Hi, erstmal vielen dank für deine Arbeit!
    Ich würde sehr gerne dein Skript nutzen und würde gerne vorher wissen ob ich noch irgendwas anpassen muss/sollte.
    Ich habe einen ODROID X4U ( Ubuntu Minimal 16.04, armhf, 2GB RAM, 8 Kerne, 8GB eMMC. + 2* 1TB Ext. USB HDDs..)
    Außerdem sollen die “Daten” auf einer der beiden Externen HDDs unter /media/usb1tb/data liegen. (Die andere ist für Backup)
    Sollte ich das im Skript anpassen oder kann ich das erstmal so durchlaufen lassen und hinterher ändern in der PHP.conf ?
    DANKE!

    • Zane says:

      config.php

      • Zane says:

        Ich habe mir das Script nochmal angeguckt, wenn ich das richtig sehe muss ich um das Data Verzeichnis auf die externe HDD zu verschieben hier:

        ###create folders
        mkdir -p /var/nc_data
        ###apply permissions
        chown -R www-data:www-data /var/nc_data

        das Verzeichnis von /var/nc_data auf /media/usb1tb/data ändern

        und hier auch:
        “###create a fail2ban Nextcloud jail
        [nextcloud]
        logpath = /var/nc_data/nextcloud.log”

        Und dann halt noch in der config.php
        Ist das dann so richtig?

  19. Andreas says:

    Hallo Carsten,
    ein super script. es läuft sweit alles, nur wenn ich mir ein SSL Zertifikat erstellen lasse mit dem 2 script habe ich keine Verbindung von ausen mehr.

    • Andreas says:

      unter Ubuntu server 18.04 LTS

    • Hallo Andreas, vielen Dank. Was meinst Du mit keine Verbindung von außen? Laufen alle Services? Welcher Fehler tritt auf?

      • Andreas says:

        das Zertifikat wird erstellt. Wenn ich micht über meine DynDns anmelden möchte bekomme ich nur eine weiße Seite, intern bekomme ich mein Nextcloud angezeigt.
        Es laufen alle instanzen soweit ich das beurteilen kann. Gruß Andreas

  20. ylaung says:

    Hi, you have mentioned the precondition for this script as Ubuntu 18.04 LTS OS.
    Will this still work for Ubuntu 16.04 LTS OS?

  21. Keven says:

    Hi Carsten
    wäre es denn möglich so ein scipt auch für arch linux arm zu erstellen denn ich setzte auf meinem C2 arch linux ein und finde es etwas aufwendig von den Ubuntu anleitungen auf Arch linux umzudenken, dennoch finde ich all deine anleitungen echt super.
    Gruß Keven

    • Hi Keven, prinzipiell ja und gern, ABER: ich habe kein Arch Linux im Einsatz und es bindet so schon sehr viel Zeit. Also mittelfristig eher nein, langfristig ja. Servus, Carsten

  22. robbie says:

    Hi Carsten,
    Thanks for the script. I’ve tried this twice on digitalocean but all I get is HTTP ERROR 500 when trying to access in the browser. Went through the process, added ssl, and even edited trusted_domains in config.php to reflect the ip, and made sure overwrite.cli.url was pointing to the right domain in config.php. Still no luck.

    • robbie says:

      I found the problem. For some reason, the script changes both the database name and username to nextcloud.example.com in config.php even though I entered just nextcloud. So it was a database error. Fixed it and everything works fine now.

      • Strange. The database will be set to nextcloud hard coded.
        CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
        You were only asked for the name of the db-user and its password.
        Maybe someting went wrong while editing the config.php?

        • robbie says:

          I did enter ‘nextcloud’ for db-user. however, the first time i opened config.php, it had appended .example.com to db-user and db-name. I thought that was the way it should be until i checked the logs and found database connection errors.

          • 4ich says:

            i had it too today but after running the ssl script
            i was wondering why this happens so i found your comment – maybe ill waste some time finding the bug

  23. Michael says:

    Thank you very much for these manual, I have utilized your step-by-step guide before and now these scripts. Great work!
    I came across a small issue on a new installation of Ubuntu Server 18.04 with the ssl-certificate.sh-script.

    With “sh ./ssl-certificate.sh” i would always get the error ‘syntax error: “(” unexpected’. Only when omitting ‘sh’ and just enter ‘./ssl-certificate.sh’ the script would run without issue.

    Just thought to mention this as a small thank you for your great work!

    Cheers

  24. Bernd says:

    Hallo,
    funktioniert das Script auch mit UBUNTU Server 18.04?

    Gruß Bernd

    • Noch nicht verifiziert – daher würde ich es in dieser Version noch nicht für 18.04 LTS einsetzen. Eine neue Version für Ubuntu 18.04 folgt in wenigen Tagen…

  25. Andreas Bonadt says:

    Das ssl-script hat mit meiner Konfiguration nicht funktioniert. Problem war die Zeile:
    sudo -u www-data sed -in ‘s/’$YOURSERVERNAME’/’$DYNDNSNAME’/’ /var/www/nextcloud/config/config.php

    Mein Servername ist nextcloud und mein Datenbanknutzer ist nextclouduser. Der wurde dann zu nextcloud.domain.deuser. In der gleichen Weise wurden die Servernamen (die vorher schon FQDN waren) verändert zu nextcloud.domain.de.domain.de

    Ansonsten waren Deine Scripts super hilfreich! Danke für die Arbeit!
    Viele Grüße,
    Andreas

  26. Jackson Storm says:

    Hi Carsten.

    Vielen Dank für das coole Script. Dieses nimmt mir jede Menge händischer Arbeit ab.

    Ich habe eine Frage dazu:
    Wie wird in diesem Fall genau die Sicherheit des MySQL-Benutzers “nextcloud” (dessen Passwort ja ebenfalls nextcloud lautet) gewährleistet? Ist es nicht sinnvoller, hier ein eigenes Passwort zu vergeben bzw. den Benutzer individiuell zu erstellen und abzusichern?

    Gruß
    Jackson

  27. Japhy says:

    I am new to shell scripts and have never used Nginx. But I would love to try this! One thing: how does Nginx handles vhosts. How does this work if I want to install in a certain vhost?

  28. kelbot says:

    Does this script have a way to setup letsencrypt or would I have to do it manually?

    • currently you have to do it manually:
      sudo -s && letsencrypt certonly -a webroot --webroot-path=/var/www/letsencrypt --rsa-key-size 4096 -d YOUR.DEDYN.IO
      Then modify the file /etc/nginx/ssl.conf regarding your dyn-dns
      sudo -s && sudo vi /etc/nginx/ssl.conf
      I prepared this file already for such a scenario 😉 – you will find commented rows regarding let’s encrypt…

    • From now (just refresh your sources from git) you may request your certificate issuing a script either.

  29. If you use functions you can do more with less. Here is an example:

    update_and_clean() {
    apt update
    apt upgrade -y
    apt autoclean -y
    apt autoremove -y
    }

    Eeach time you want to run those commands you only need to run: update_and_clean – in other words, you can make your code cleaner.

    Welcome to join us on Github: https://github.com/nextcloud/vm 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *