Nextcloud 18 installation guide Ubuntu
Nextcloud 18 installation guide Ubuntu
Pre-requirements
Nextcloud 18 installation guide Ubuntu
From my perspective the requirements for this guide may be rated as low: you only have to
- provide a 64Bit Server (e.g. Intel NUC),
- forward two ports (80 and 443) from internet (your router e.g. FritzBox or Speedport) to your internal Nextcloud server
- and install the operating system Ubuntu 18.04. LTS (64Bit).
Preparation:
sudo -s add-apt-repository universe && apt update && apt upgrade -y apt install software-properties-common && apt install -y zip unzip screen curl ffmpeg add-apt-repository -y ppa:ondrej/php && add-apt-repository -y ppa:ondrej/apache2 && add-apt-repository -y ppa:certbot/certbot apt update && apt upgrade -y && apt autoremove -y && apt autoclean -y
mkdir -p /var/www /var/nc_data chown -R www-data:www-data /var/nc_data /var/www
MariaDB
If you are interested in Postgresql instead of MariaDB please have a look here.
First we add the MariaDB repository to gain long term support using MariaDB 10.3 – maintained until 2023:
apt-key adv --recv-keys --keyserver hkps://keyserver.ubuntu.com:443 0xF1656F24C74CD1D8 add-apt-repository 'deb [arch=amd64,arm64] http://ftp.hosteurope.de/mirror/mariadb.org/repo/10.3/ubuntu bionic main'
Update your system and install MariaDB:
apt update && apt install mariadb-server -y
Verify your database server version:
mysql --version
An output like
mysql Ver 15.1 Distrib 10.3.16-MariaDB, for debian-linux-gnu (x86_64) using ...
should appear.
Secure MariaDB:
mysql_secure_installation
Enter current password for root (enter for none): <ENTER> or type the password Set root password? [Y/n] Y
If already set during the MariaDB installation you will be asked wether to change or keep the password
Remove anonymous users? [Y/n] Y Disallow root login remotely? [Y/n] Y Remove test database and access to it? [Y/n] Y Reload privilege tables now? [Y/n] Y
Configure MariaDB:
service mysql stop mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak && vi /etc/mysql/my.cnf
Change the entire my.cnf-file to:
[client] default-character-set = utf8mb4 port = 3306 socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
log_error = /var/log/mysql/mysql_error.log nice = 0 socket = /var/run/mysqld/mysqld.sock
[mysqld]
basedir = /usr bind-address = 127.0.0.1 binlog_format = ROW bulk_insert_buffer_size = 16M character-set-server = utf8mb4 collation-server = utf8mb4_general_ci concurrent_insert = 2 connect_timeout = 5 datadir = /var/lib/mysql default_storage_engine = InnoDB expire_logs_days = 7 general_log_file = /var/log/mysql/mysql.log general_log = 0 innodb_buffer_pool_size = 1024M innodb_buffer_pool_instances = 1 innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 32M innodb_max_dirty_pages_pct = 90 innodb_file_per_table = 1 innodb_open_files = 400 innodb_io_capacity = 4000 innodb_flush_method = O_DIRECT key_buffer_size = 128M lc_messages_dir = /usr/share/mysql lc_messages = en_US log_bin = /var/log/mysql/mariadb-bin log_bin_index = /var/log/mysql/mariadb-bin.index log_error=/var/log/mysql/mysql_error.log log_slow_verbosity = query_plan log_warnings = 2 long_query_time = 1 max_allowed_packet = 16M max_binlog_size = 100M max_connections = 200 max_heap_table_size = 64M myisam_recover_options = BACKUP myisam_sort_buffer_size = 512M port = 3306 pid-file = /var/run/mysqld/mysqld.pid query_cache_limit = 2M query_cache_size = 64M query_cache_type = 1 query_cache_min_res_unit = 2k read_buffer_size = 2M read_rnd_buffer_size = 1M skip-external-locking skip-name-resolve slow_query_log_file = /var/log/mysql/mariadb-slow.log slow-query-log = 1 socket = /var/run/mysqld/mysqld.sock sort_buffer_size = 4M table_open_cache = 400 thread_cache_size = 128 tmp_table_size = 64M tmpdir = /tmp transaction_isolation = READ-COMMITTED user = mysql wait_timeout = 600
[mysqldump]
max_allowed_packet = 16M quick quote-names
[isamchk]
!include /etc/mysql/mariadb.cnf !includedir /etc/mysql/conf.d/ key_buffer = 16M
Restart MariaDB:
service mysql restart
Create the database and the user:
mysql -uroot -p -e "CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER nextcloud@localhost identified by 'nextcloud'; GRANT ALL PRIVILEGES on nextcloud.* to nextcloud@localhost; FLUSH privileges;"
Verify the transaction Isolation level was set to READ_Commit and the collation was set to UTF8MB4 properly:
mysql -h localhost -uroot -p -e "SELECT @@TX_ISOLATION; SELECT SCHEMA_NAME 'database', default_character_set_name 'charset', DEFAULT_COLLATION_NAME 'collation' FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='nextcloud'"
If the resultset will be “READ-COMMITTED” and “utf8mb4_general_ci” as shown go ahead with the installation of Apache, PHP and Redis.
Install Apache2, PHP and Redis-Server:
apt install libapache2-mod-php7.4 php7.4-cli php7.4-common php7.4-mbstring php7.4-gd php7.4-intl php7.4-xml php7.4-mysql php7.4-zip php7.4-dev php7.4-curl php7.4-fpm php7.4-json php7.4-bz2 php7.4-ldap php-dompdf php-apcu imagemagick php-imagick php-smbclient redis-server php-redis unzip -y
Disable PHP 7.4 and mpm_prefork and enable php7.4-fpm with mpm_event:
a2dismod php7.4 && a2dismod mpm_prefork && a2enmod proxy_fcgi setenvif mpm_event && service apache2 restart a2enconf php7.4-fpm && service apache2 restart
Download and extract the latest Nextcloud Release:
wget https://download.nextcloud.com/server/releases/latest.zip unzip latest.zip && mv nextcloud/ /var/www/html/ && chown -R www-data:www-data /var/www/html/nextcloud && rm -f latest.zip
Redis
Change configuration and group membership:
cp /etc/redis/redis.conf /etc/redis/redis.conf.bak sed -i "s/port 6379/port 0/" /etc/redis/redis.conf sed -i s/\#\ unixsocket/\unixsocket/g /etc/redis/redis.conf sed -i "s/unixsocketperm 700/unixsocketperm 770/" /etc/redis/redis.conf sed -i "s/# maxclients 10000/maxclients 512/" /etc/redis/redis.conf usermod -aG redis www-data cp /etc/sysctl.conf /etc/sysctl.conf.bak && sed -i '$avm.overcommit_memory = 1' /etc/sysctl.conf
Enable further Apache modules:
a2enmod rewrite headers env dir mime && service apache2 restart
Prepare your server for Let’s Encrypt:
apt install python-certbot-apache -y cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/001-nextcloud.conf a2dissite 000-default.conf
Modify the initial Nextcloud vhost:
vi /etc/apache2/sites-available/001-nextcloud.conf
Make ammendments to the following rows:
ServerName your.dedyn.io ServerAdmin webmaster@dedyn.io DocumentRoot /var/www/html/nextcloud
Request your certificates by issuing
a2ensite 001-nextcloud.conf && service apache2 restart && certbot --apache
Choose ‘1’, then ‘2’ as shown in the screenshot:
Make further adjustements to the intial vhost:
mv /etc/apache2/sites-available/001-nextcloud.conf /etc/apache2/sites-available/001-nextcloud.conf.le-bak vi /etc/apache2/sites-available/001-nextcloud.conf
Paste all the following rows and replace the red ones:
<VirtualHost *:80> Servername your.dedyn.io ServerAdmin mail@dedyn.io DocumentRoot /var/www/html/nextcloud ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined RewriteEngine on RewriteCond %{SERVER_NAME} =your.dedyn.io RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] </VirtualHost>
Create the vhost file and paste the following rows:
vi /etc/apache2/sites-available/001-nextcloud-le-ssl.conf
Paste all the following rows and replace the red ones:
<IfModule mod_ssl.c> <VirtualHost *:443> SSLEngine on SSLOptions +StrictRequire LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" vhost_combined LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common ServerAdmin mail@dedyn.io DocumentRoot /var/www/html/nextcloud ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined ServerName your.dedyn.io SSLCertificateFile /etc/letsencrypt/live/your.dedyn.io/fullchain.pem SSLCACertificateFile /etc/letsencrypt/live/your.dedyn.io/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/your.dedyn.io/privkey.pem <Directory /var/www/html/nextcloud/> Options +FollowSymlinks AllowOverride All <IfModule mod_dav.c> Dav off </IfModule> SetEnv HOME /var/www/html/nextcloud SetEnv HTTP_HOME /var/www/html/nextcloud </Directory> <IfModule mod_headers.c> Header always set Strict-Transport-Security "max-age=15768000; preload" #Header set Referrer-Policy "strict-origin-when-cross-origin" #Header set X-Content-Type-Options "nosniff" #Header always set X-Frame-Options "SAMEORIGIN" </IfModule> </VirtualHost> SSLProtocol -all +TLSv1.3 +TLSv1.2 SSLCipherSuite TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384 SSLHonorCipherOrder on SSLCompression off SSLSessionTickets off SSLUseStapling on SSLStaplingResponderTimeout 5 SSLStaplingReturnResponderErrors off SSLStaplingCache shmcb:/var/run/ocsp(128000) SSLOpenSSLConfCmd Curves X448:secp521r1:secp384r1:prime256v1 SSLOpenSSLConfCmd ECDHParameters secp384r1 SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem" </IfModule>
Enhance security:
openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
Please be patient, it will take a while depending on your hardware. When dhparam was generated just modify the apache.conf:
vi /etc/apache2/apache2.conf
At the beginning of this file add the following new row
ServerName your.dedyn.io
and replace ‘AllowOverride None‘ to ‘All‘ as follows in the shown section:
... <Directory /var/www/> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> ...
Restart apache by issuing
service apache2 restart
Tune your PHP:
cp /etc/php/7.4/fpm/pool.d/www.conf /etc/php/7.4/fpm/pool.d/www.conf.bak cp /etc/php/7.4/cli/php.ini /etc/php/7.4/cli/php.ini.bak cp /etc/php/7.4/fpm/php.ini /etc/php/7.4/fpm/php.ini.bak cp /etc/php/7.4/fpm/php-fpm.conf /etc/php/7.4/fpm/php-fpm.conf.bak
sed -i "s/;env\[HOSTNAME\] = /env[HOSTNAME] = /" /etc/php/7.4/fpm/pool.d/www.conf sed -i "s/;env\[TMP\] = /env[TMP] = /" /etc/php/7.4/fpm/pool.d/www.conf sed -i "s/;env\[TMPDIR\] = /env[TMPDIR] = /" /etc/php/7.4/fpm/pool.d/www.conf sed -i "s/;env\[TEMP\] = /env[TEMP] = /" /etc/php/7.4/fpm/pool.d/www.conf sed -i "s/;env\[PATH\] = /env[PATH] = /" /etc/php/7.4/fpm/pool.d/www.conf sed -i "s/pm.max_children = .*/pm.max_children = 240/" /etc/php/7.4/fpm/pool.d/www.conf sed -i "s/pm.start_servers = .*/pm.start_servers = 20/" /etc/php/7.4/fpm/pool.d/www.conf sed -i "s/pm.min_spare_servers = .*/pm.min_spare_servers = 10/" /etc/php/7.4/fpm/pool.d/www.conf sed -i "s/pm.max_spare_servers = .*/pm.max_spare_servers = 20/" /etc/php/7.4/fpm/pool.d/www.conf sed -i "s/;pm.max_requests = 500/pm.max_requests = 500/" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/output_buffering =.*/output_buffering = 'Off'/" /etc/php/7.4/cli/php.ini sed -i "s/max_execution_time =.*/max_execution_time = 1800/" /etc/php/7.4/cli/php.ini sed -i "s/max_input_time =.*/max_input_time = 3600/" /etc/php/7.4/cli/php.ini sed -i "s/post_max_size =.*/post_max_size = 10240M/" /etc/php/7.4/cli/php.ini sed -i "s/upload_max_filesize =.*/upload_max_filesize = 10240M/" /etc/php/7.4/cli/php.ini sed -i "s/max_file_uploads =.*/max_file_uploads = 100/" /etc/php/7.4/cli/php.ini sed -i "s/;date.timezone.*/date.timezone = Europe\/\Berlin/" /etc/php/7.4/cli/php.ini sed -i "s/;session.cookie_secure.*/session.cookie_secure = True/" /etc/php/7.4/cli/php.ini
sed -i "s/memory_limit = 128M/memory_limit = 512M/" /etc/php/7.4/fpm/php.ini sed -i "s/output_buffering =.*/output_buffering = 'Off'/" /etc/php/7.4/fpm/php.ini sed -i "s/max_execution_time =.*/max_execution_time = 1800/" /etc/php/7.4/fpm/php.ini sed -i "s/max_input_time =.*/max_input_time = 3600/" /etc/php/7.4/fpm/php.ini sed -i "s/post_max_size =.*/post_max_size = 10240M/" /etc/php/7.4/fpm/php.ini sed -i "s/upload_max_filesize =.*/upload_max_filesize = 10240M/" /etc/php/7.4/fpm/php.ini sed -i "s/max_file_uploads =.*/max_file_uploads = 100/" /etc/php/7.4/fpm/php.ini sed -i "s/;date.timezone.*/date.timezone = Europe\/\Berlin/" /etc/php/7.4/fpm/php.ini sed -i "s/;session.cookie_secure.*/session.cookie_secure = True/" /etc/php/7.4/fpm/php.ini sed -i "s/;opcache.enable=.*/opcache.enable=1/" /etc/php/7.4/fpm/php.ini sed -i "s/;opcache.enable_cli=.*/opcache.enable_cli=1/" /etc/php/7.4/fpm/php.ini sed -i "s/;opcache.memory_consumption=.*/opcache.memory_consumption=128/" /etc/php/7.4/fpm/php.ini sed -i "s/;opcache.interned_strings_buffer=.*/opcache.interned_strings_buffer=8/" /etc/php/7.4/fpm/php.ini sed -i "s/;opcache.max_accelerated_files=.*/opcache.max_accelerated_files=10000/" /etc/php/7.4/fpm/php.ini sed -i "s/;opcache.revalidate_freq=.*/opcache.revalidate_freq=1/" /etc/php/7.4/fpm/php.ini sed -i "s/;opcache.save_comments=.*/opcache.save_comments=1/" /etc/php/7.4/fpm/php.ini sed -i '$aapc.enable_cli=1' /etc/php/7.4/mods-available/apcu.ini
sed -i "s/;emergency_restart_threshold =.*/emergency_restart_threshold = 10/" /etc/php/7.4/fpm/php-fpm.conf sed -i "s/;emergency_restart_interval =.*/emergency_restart_interval = 1m/" /etc/php/7.4/fpm/php-fpm.conf sed -i "s/;process_control_timeout =.*/process_control_timeout = 10s/" /etc/php/7.4/fpm/php-fpm.conf
sed -i "s/09,39.*/# &/" /etc/cron.d/php (crontab -l ; echo "09,39 * * * * /usr/lib/php/sessionclean 2>&1") | crontab -u root -
Nextcloud Installation:
Open your browser and call to configure Nextcloud. Enter the following values:
https://your.dedyn.io Username: Your-NC-Admin Password*: Your-NC_Password! Data folder: /var/nc_data Datenbankuser: nextcloud DB-Passwort*: nextcloud Datenbank-Name: nextcloud Host: localhost
After a few seconds Nexcloud will be installed and you will be redirected to Nextclouds file app. Please log out directly and make further ammendments.
sudo -u www-data vi /var/www/html/nextcloud/.htaccess
Add the red ones:
... ErrorDocument 403 // ErrorDocument 404 // <IfModule mod_rewrite.c> Options -MultiViews RewriteRule ^core/js/oc.js$ index.php [PT,E=PATH_INFO:$1] RewriteRule ^core/preview.png$ index.php [PT,E=PATH_INFO:$1] RewriteCond %{REQUEST_FILENAME} !\.(css|js|svg|gif|png|html|ttf|woff2?|ico|jpg|jpeg)$ RewriteCond %{REQUEST_FILENAME} !core/img/favicon.ico$ RewriteCond %{REQUEST_FILENAME} !core/img/manifest.json$ RewriteCond %{REQUEST_FILENAME} !/remote.php RewriteCond %{REQUEST_FILENAME} !/public.php RewriteCond %{REQUEST_FILENAME} !/cron.php RewriteCond %{REQUEST_FILENAME} !/core/ajax/update.php RewriteCond %{REQUEST_FILENAME} !/status.php RewriteCond %{REQUEST_FILENAME} !/ocs/v1.php RewriteCond %{REQUEST_FILENAME} !/ocs/v2.php RewriteCond %{REQUEST_FILENAME} !/robots.txt RewriteCond %{REQUEST_FILENAME} !/updater/ RewriteCond %{REQUEST_FILENAME} !/ocs-provider/ RewriteCond %{REQUEST_URI} !^/\.well-known/(acme-challenge|pki-validation)/.* RewriteRule . index.php [PT,E=PATH_INFO:$1] RewriteBase / <IfModule mod_env.c> SetEnv front_controller_active true <IfModule mod_dir.c> DirectorySlash off </IfModule> </IfModule> </IfModule>
Then adjust Nextclouds config.php.
sudo -u www-data cp /var/www/html/nextcloud/config/config.php /var/www/html/nextcloud/config/config.php.bak
Expand your Nextcloud config.php:
sudo -u www-data sed -i 's/^[ ]*//' /var/www/html/nextcloud/config/config.php sudo -u www-data sed -i '/);/d' /var/www/html/nextcloud/config/config.php
sudo -u www-data cat <<EOF >>/var/www/html/nextcloud/config/config.php 'activity_expire_days' => 14, 'auth.bruteforce.protection.enabled' => true, 'blacklisted_files' => array ( 0 => '.htaccess', 1 => 'Thumbs.db', 2 => 'thumbs.db', ), 'cron_log' => true, 'enable_previews' => true, 'enabledPreviewProviders' => array ( 0 => 'OC\\Preview\\PNG', 1 => 'OC\\Preview\\JPEG', 2 => 'OC\\Preview\\GIF', 3 => 'OC\\Preview\\BMP', 4 => 'OC\\Preview\\XBitmap', 5 => 'OC\\Preview\\Movie', 6 => 'OC\\Preview\\PDF', 7 => 'OC\\Preview\\MP3', 8 => 'OC\\Preview\\TXT', 9 => 'OC\\Preview\\MarkDown', ), 'filesystem_check_changes' => 0, 'filelocking.enabled' => 'true', 'htaccess.RewriteBase' => '/', 'integrity.check.disabled' => false, 'knowledgebaseenabled' => false, 'logfile' => '/var/nc_data/nextcloud.log', 'loglevel' => 2, 'logtimezone' => 'Europe/Berlin', 'log_rotate_size' => 104857600, 'maintenance' => false, 'memcache.local' => '\\OC\\Memcache\\APCu', 'memcache.locking' => '\\OC\\Memcache\\Redis', 'overwriteprotocol' => 'https', 'preview_max_x' => 1024, 'preview_max_y' => 768, 'preview_max_scale_factor' => 1, 'redis' => array ( 'host' => '/var/run/redis/redis-server.sock', 'port' => 0, 'timeout' => 0.0, ), 'quota_include_external_storage' => false, 'share_folder' => '/Shares', 'skeletondirectory' => '', 'theme' => '', 'trashbin_retention_obligation' => 'auto, 7', 'updater.release.channel' => 'stable', ); EOF
Restart all relevant services
service php7.4-fpm restart && service redis-server restart && service apache2 restart
Adjust Nextcloud
sudo -u www-data php /var/www/html/nextcloud/occ app:disable survey_client sudo -u www-data php /var/www/html/nextcloud/occ app:disable firstrunwizard sudo -u www-data php /var/www/html/nextcloud/occ app:enable admin_audit sudo -u www-data php /var/www/html/nextcloud/occ app:enable files_pdfviewer
Optimize your Nextcloud once (a) and regulary (b) using a script
(a)
/usr/sbin/service apache2 stop sudo -u www-data php /var/www/html/nextcloud/occ db:add-missing-indices sudo -u www-data php /var/www/html/nextcloud/occ db:convert-filecache-bigint /usr/sbin/service apache2 start
(infos: BigInt, missing indices)
(b)
vi /root/optimize.sh
#!/bin/bash redis-cli -s /var/run/redis/redis-server.sock <<EOF FLUSHALL quit EOF sudo -u www-data php /var/www/html/nextcloud/occ files:scan --all sudo -u www-data php /var/www/html/nextcloud/occ files:scan-app-data exit 0
Save the script and mark it as executable
chmod +x /root/optimize.sh
Issue the optimize.sh script initially:
/root/optimize.sh
Add Nextcloud cronjobs for www-data and root
For www-data:
crontab -u www-data -e
Paste the following rows
*/5 * * * * php -f /var/www/html/nextcloud/cron.php > /dev/null 2>&1
For root:
crontab -e
Paste the follwoing rows:
5 1 * * * /root/optimize.sh > /dev/null 2>&1
Don’t forget to switch from Ajax to Cron in Nextclouds-Adminpanel or use Nextcloud CLI to switch immediately:
sudo -u www-data php /var/www/html/nextcloud/occ background:cron
Modify the mpm_event.conf
vi /etc/apache2/mods-available/mpm_event.conf
Change the “MaxConnectionsPerChild” value to 1000:
StartServers 2 MinSpareThreads 25 MaxSpareThreads 75 ThreadLimit 64 ThreadsPerChild 25 MaxRequestWorkers 150 MaxConnectionsPerChild 1000
At least we will enable http2 by issuing
a2enmod http2 && service php7.4-fpm restart && service apache2 restart
and create a http2.conf with few settings:
vi /etc/apache2/conf-available/http2.conf
Paste all the following rows:
<IfModule http2_module> Protocols h2 h2c http/1.1 H2Direct on H2StreamMaxMemSize 5120000000 </IfModule>
and enable this configuration by issuing
a2enconf http2 && service apache2 restart
Finally we will secure Apache to a minimum level by disabling Apaches status module (as long as you won’t need it in particular) and altering the security.conf:
a2dismod status && vi /etc/apache2/conf-available/security.conf
Change the values to the red ones:
ServerTokens Prod ServerSignature Off TraceEnable Off
and restart PHP, Apache2 and Redis one last time.
service php7.4-fpm restart && service redis-server restart && service apache2 restart
Nextcloud is now already secured, up and running! Beyond that we will harden the system using fail2ban and ufw. First we install and configure fail2ban and finally we will configure the firewall (ufw).
Install and configure fail2ban:
apt update && apt install fail2ban -y
Create the Nextcloud-filter (download here):
vi /etc/fail2ban/filter.d/nextcloud.conf
Paste the following rows to the fail2ban filter for Nextcloud:
[Definition] failregex=^{"reqId":".*","remoteAddr":".*","app":"core","message":"Login failed: '.*' \(Remote IP: '<HOST>'\)","level":2,"time":".*"}$ ^{"reqId":".*","level":2,"time":".*","remoteAddr":".*","user,:".*","app":"no app in context".*","method":".*","message":"Login failed: '.*' \(Remote IP: '<HOST>'\)".*}$ ^{"reqId":".*","level":2,"time":".*","remoteAddr":".*","user":".*","app":".*","method":".*","url":".*","message":"Login failed: .* \(Remote IP: <HOST>\).*}$
Create a new jail (download here):
vi /etc/fail2ban/jail.d/nextcloud.local
Paste the following rows:
[nextcloud] backend = auto enabled = true port = 80,443 protocol = tcp filter = nextcloud maxretry = 6 bantime = 18000 findtime = 36000 logpath = /var/nc_data/nextcloud.log
Re-start the fail2ban-service:
service fail2ban restart
Configure your ufw (uncomplicated firewall):
ufw allow 80/tcp && ufw allow 443/tcp && ufw allow 22/tcp && ufw logging medium
Enable and restart ufw by running
ufw enable && service ufw restart
Enjoy your personal data in your secured and hardened Nextcloud-Server!
Don’t forget to backup your Nextcloud
Find more instructions here: Nextcloud Backup and Restore
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 15 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 7 years.
Nextcloud 18 installation guide Ubuntu