Build your Nextcloud 14 Server using one shell script


Last Updates:

October, 26th 2018:
– added ssl early data directive to both: ssl.conf and proxy.conf
– added phpimagickexcepttion()


The initial script (install-nextcloud.sh) will install your self hosted Nextcloud within few minutes fully automated on either AMD64 or ARM64 (Odroid C2) environments. Your server will be built of:

  • Fail2Ban (Nextcloud and SSH jails)
  • MariaDB 10.3.10
  • Nextcloud 14 latest
  • NGINX 1.15.6 new
  • OpenSSL 1.1.1 new + TLS v. 1.3 new
  • PHP 7.2.11
  • Redis-Server
  • self signed or Let’s Encrypt SSL using the second script
  • UFW (22, 80, 443)

Please remove already installed packages of NGINX, PHP, MariaDB and Redis first

sudo apt remove <package> --purge && sudo apt autoremove -y

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

or

./install-nextcloud-arm64.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

Carsten Rieger

Carsten Rieger is a senior system engineer in full-time and also working as an IT freelancer. He is working with linux environments for more than 13 years, an Open Source enthusiast and highly motivated on linux installation and troubleshooting. Mostly working with Debian/Ubuntu Linux, Nginx and Apache web server, MariaDB/MySQL/PostgreSQL, PHP, Cloud infrastructure (e.g. Nextcloud) and other open source projects (e.g. Roundcube) and in voluntary work for the Dr. Michael & Angela Jacobi Stiftung for more than 6 years.

112 Responses

  1. Thomas Lippert says:

    Super Script! 😉
    Ich habe das Problem, das mit nextcloud 14.0.3 immer ALLE Session offen bleiben. D.h. wenn der User eingeloggt ist, der Browser geschlossen wird und JEMAND dann den Browser wieder öffnet, dann ist derjenige sofort in nextcloud angemeldet. In Version 13 musste man sich nach jedem Session close wieder neu anmelden. Ich sehe das als ein riesiges Sicherheitsrisiko, wenn man sich von fremden Rechner anmeldet. Gibt es eine möglichkeit, das die session wieder geclosed werden, wenn der Browser geschlossen wird. Ich habe schon alle einstellungen in der config.php durchprobiert (remember_login_cookie_lifetime, session_lifetime usw.). leider keine Besserung.

  2. Thomas says:

    Guten Abend,

    vielen Dank für dieses Tolle script. Das Script ist bei mir ohne zu erkennenden Fehler durch gelaufen. Allerdings startet nginx nicht. Ich bekomme folgenden Fehler:
    nginx: [alert] could not open error log file: open() “/var/log/nginx/error.log” failed (13: Permission denied)
    2018/10/25 23:59:23 [warn] 2187#2187: the “user” directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:1
    2018/10/25 23:59:23 [emerg] 2187#2187: invalid number of arguments in “proxy_set_header” directive in /etc/nginx/proxy.conf:8
    nginx: configuration file /etc/nginx/nginx.conf test failed

    Hätten Sie eine Idee für mein Problem?

    Vielen Dank und Gruß
    Thomas

    • Entschuldigung! Ich habe das “quotieren” vergessen und dadurch einen Fehler in das Script eingebaut. Bitte ändern Sie mittels “vi /etc/nginx/proxy.conf” die Zeile “proxy_set_header Early-Data ;” zu “proxy_set_header Early-Data $ssl_early_data;” und starten danach den NGINX neu “service nginx restart“.

  3. rüdiger says:

    Hallo Carsten,
    mit dem Script ist die Cloud richtig flott und fehlerfrei eingerichtet. Vielen Dank dafür.
    Ich habe beim Einrichten von MariaDB nicht richtig aufgepasst und kein Passwort vergeben.
    Wie kann ich das am einfachsten nachholen?
    Viele Grüße
    Rüdiger

  4. Mats says:

    U rock bud!
    Installed like a breeze but. When staring the fail2ban daemon I’m getting no access to Nextcloud now on port 80 or 443. any ideas?

    \m

  5. Anas A says:

    It’s awesome script.
    Thank you so much.
    would you please tell me how can i add more than one domain to nextcloud with nginx.

    Regards

    • Create a further conf-file (etc/nginx/conf/seconddomain.conf) and define a unique servername. Declare the Nextcloud one as default_server…that’s it! Request your ssl certificates withe the same command and add “…- your.dedyn.io -d second.domain.tld”

  6. isaac says:

    Hi Carsten,

    I get this message upon issuing ……../usr/local/src/install-nextcloud/ssl-renewal.sh

    ./ssl-renewal.sh: line 22: /home/username/ssl-renewal.txt: No such file or directory

    is that to be expected?

    thanks…

  7. Bhavin Patel says:

    I get this error while installing nextcloud through script.

    Error while trying to create admin user: Failed to connect to the database: An exception occured in driver: SQLSTATE[HY000] [1045] Access denied for user ‘myuser’@’localhost’ (using password: YES)

    I get the above error at last part when creating admin user for next cloud.

    After carefully observing the processes i have been able to know that database details which we enter at time of installing mariadb that database is only not getting created.

    After this i manually created the required database and then manually gave below command from script.

    sudo -u www-data php /var/www/nextcloud/occ maintenance:install –database “mysql” –database-name “mydatabase” –database-user “mynextadmin” –database-pass “nextadmin” –admin-user “ncadmin” –admin-pass “ncadmin123” –data-dir “/mnt/ncdata”

    But the above command line gives below error.

    Error while trying to create admin user: Failed to connect to the database: An exception occured in driver: SQLSTATE[HY000] [1045] Access denied for user ‘myuser’@’localhost’ (using password: YES)

    • You mixed a few database params: “…–database-user “mynextadmin…” and “…‘myuser’@’localhost’…”
      Did you set a db root pwd before the mysql_secure_installation process was started?

      • Bhavin Patel says:

        ooo yes thanks for reply..

        also i found issue with me.. even though it is well written in your article not to provide password at time of mariadb installation i did that.. even before script can create db and user for next cloud..

        i started again with clean OS and got installation with out any error..

        just one small error i got with fail2ban as below
        Failed to access socket path: /var/run/fail2ban/fail2ban.sock. Is fail2ban running?

        so after reboot i checked below command

        root@domdomservers:~# fail2ban-client start

        gave me output as below..
        ======
        No file(s) found for glob /var/nc_data/nextcloud.log
        Failed during configuration: Have not found any log file for nextcloud jail
        created nextcloud.log file manually in required directory and then rebooted server every thing working fine. This is for kind information as to debug why file nextcloud.log did not created manually

  8. Patrick says:

    Yo! This looks verrry nice!
    Has anyone already tested the script on an ARM board? I have few Odroid (c2, xu4) boards that can be packed with the latest LTS of Ubuntu 18.04, so I was wandering if they can be put at some useful work again.

  9. Johannes K. says:

    Hi Carsten,
    vielen Dank für dieses tolle Skript. Meine Nextcloud ist jetzt erreichbar unter http://meinedomain.de.
    Ich hätte aber gerne, dass die Cloud nur erreichbar ist unter http://meinedomain.de/meineCloud. Wie kann ich das am einfachsten erreichen?
    Danke & Grüße
    Johannes

  10. gerionis says:

    What action is performed by fail2ban and where is it stored?

  11. Ruben says:

    Thank You !!!
    it works perfectly.

  12. 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?

  13. 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.

  14. 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
    DoctrineDBALExceptionDriverException: 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:

    DoctrineDBALDriverAbstractMySQLDriver->convertException(“An exceptio … n”, DoctrineDBA … ]})

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

    DoctrineDBALDBALException::driverExceptionDuringQuery(DoctrineDBA … {}, DoctrineDBA … ]}, “INSERT INTO … 0”, { 1: “8”,2: … “})

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

    DoctrineDBALConnection->executeUpdate(“INSERT INTO … 0”, [ “8”,”14″,1 … “], [])

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

    OCDBConnection->executeUpdate(“INSERT INTO … 0”, [ “8”,”14″,1 … “])

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

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

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

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

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

    OCFilesCacheCache->insert(“files/test/inf/usbport.inf”, { mimetype: … “})

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

    OCFilesCacheCache->put(“files/test/inf/usbport.inf”, { mimetype: … “})

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

    OCFilesCacheScanner->addToCache(“files/test/inf/usbport.inf”, { mimetype: … “}, -1)

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

    OCFilesCacheScanner->scanFile(“files/test/inf/usbport.inf”, 3, 1030, false, false)

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

    OCFilesCacheScanner->scan(“files/test/inf/usbport.inf”, false, 3, false)

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

    OCFilesCacheUpdater->update(“files/test/inf/usbport.inf”)

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

    OCADAVConnectorSabreFile->put(null)

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

    OCADAVConnectorSabreDirectory->createFile(“usbport.inf”, null)

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

    SabreDAVServer->createFile(“files/marti … f”, null, null)

    SabreDAVCorePlugin->httpPut(SabreHTTPR … “}, SabreHTTPResponse {})

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

    call_user_func_array([ SabreDAV … “], [ SabreHTTP … }])

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

    SabreEventEventEmitter->emit(“method:PUT”, [ SabreHTTP … }])

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

    SabreDAVServer->invokeMethod(SabreHTTPR … “}, SabreHTTPResponse {})

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

    SabreDAVServer->exec()

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

    OCADAVServer->exec()

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

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

    Eingefasst vonDoctrineDBALDriverPDOException: 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:

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

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

    DoctrineDBALConnection->executeUpdate(“INSERT INTO … 0”, [ “8”,”14″,1 … “], [])

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

    OCDBConnection->executeUpdate(“INSERT INTO … 0”, [ “8”,”14″,1 … “])

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

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

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

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

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

    OCFilesCacheCache->insert(“files/test/inf/usbport.inf”, { mimetype: … “})

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

    OCFilesCacheCache->put(“files/test/inf/usbport.inf”, { mimetype: … “})

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

    OCFilesCacheScanner->addToCache(“files/test/inf/usbport.inf”, { mimetype: … “}, -1)

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

    OCFilesCacheScanner->scanFile(“files/test/inf/usbport.inf”, 3, 1030, false, false)

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

    OCFilesCacheScanner->scan(“files/test/inf/usbport.inf”, false, 3, false)

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

    OCFilesCacheUpdater->update(“files/test/inf/usbport.inf”)

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

    OCADAVConnectorSabreFile->put(null)

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

    OCADAVConnectorSabreDirectory->createFile(“usbport.inf”, null)

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

    SabreDAVServer->createFile(“files/marti … f”, null, null)

    SabreDAVCorePlugin->httpPut(SabreHTTPR … “}, SabreHTTPResponse {})

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

    call_user_func_array([ SabreDAV … “], [ SabreHTTP … }])

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

    SabreEventEventEmitter->emit(“method:PUT”, [ SabreHTTP … }])

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

    SabreDAVServer->invokeMethod(SabreHTTPR … “}, SabreHTTPResponse {})

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

    SabreDAVServer->exec()

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

    OCADAVServer->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:

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

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

    DoctrineDBALConnection->executeUpdate(“INSERT INTO … 0”, [ “8”,”14″,1 … “], [])

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

    OCDBConnection->executeUpdate(“INSERT INTO … 0”, [ “8”,”14″,1 … “])

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

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

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

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

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

    OCFilesCacheCache->insert(“files/test/inf/usbport.inf”, { mimetype: … “})

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

    OCFilesCacheCache->put(“files/test/inf/usbport.inf”, { mimetype: … “})

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

    OCFilesCacheScanner->addToCache(“files/test/inf/usbport.inf”, { mimetype: … “}, -1)

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

    OCFilesCacheScanner->scanFile(“files/test/inf/usbport.inf”, 3, 1030, false, false)

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

    OCFilesCacheScanner->scan(“files/test/inf/usbport.inf”, false, 3, false)

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

    OCFilesCacheUpdater->update(“files/test/inf/usbport.inf”)

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

    OCADAVConnectorSabreFile->put(null)

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

    OCADAVConnectorSabreDirectory->createFile(“usbport.inf”, null)

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

    SabreDAVServer->createFile(“files/marti … f”, null, null)

    SabreDAVCorePlugin->httpPut(SabreHTTPR … “}, SabreHTTPResponse {})

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

    call_user_func_array([ SabreDAV … “], [ SabreHTTP … }])

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

    SabreEventEventEmitter->emit(“method:PUT”, [ SabreHTTP … }])

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

    SabreDAVServer->invokeMethod(SabreHTTPR … “}, SabreHTTPResponse {})

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

    SabreDAVServer->exec()

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

    OCADAVServer->exec()

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

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

  15. DFFVB says:

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

  16. 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”

  17. 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

  18. 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.

  19. 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

  20. 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.

  21. 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?!

  22. 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.

  23. 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! ;-))

  24. 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

  25. 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

  26. 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

  27. 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

  28. 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?

  29. 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

  30. 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?

    • Hi, the current version only supports Ubuntu 18.04.LTS. But you can manually download the Script for Ubuntu 16.04.4 LTS.

      • I added the script for Ubuntu 16.04.4 LTS – looking forward to your feedback.

        • ylaung says:

          Hello Carsten, thanks for the help. I installed it manually following your guide and it works.

      • Felix says:

        Hi, the sh-file is not available on github. I get only an 404 error. My VPS is running with Ubuntu 16.04.5 LTS. Is it possible to run the script with this version?

        • It is not compatible with Ubuntu 16.x!

          • Fail2ban is harden your system: information

            “…Fail2ban scans log files (e.g. /var/log/nginx/) and bans IPs that show the malicious signs — too many password failures, seeking for exploits, etc. Generally Fail2Ban is then used to update firewall rules to reject the IP addresses for a specified amount of time, although any arbitrary other action (e.g. sending an email) could also be configured. Out of the box Fail2Ban comes with filters for various services (apache, courier, ssh, etc).

            Fail2Ban is able to reduce the rate of incorrect authentications attempts however it cannot eliminate the risk that weak authentication presents. Configure services to use only two factor or public/private authentication mechanisms if you really want to protect services. …”

  31. 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

  32. 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

  33. 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

  34. 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…

  35. 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

  36. 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

  37. 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?

  38. 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.

  39. 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 *