This article will guide you how to install Nextcloud 22 on Ubuntu 20.04 with Apache web server and SSL certificate from Let’s encrypt.
Before we start the process, you should point your domain to the server IP. This will be required by LE for retrieving SSL certificate.
Login to your server and update the system. You can also setup the firewall to begin with. Port 22
is used for SSH, if you have changed this port make sure to change it in the command below.
apt update && apt upgrade
ufw allow 22
ufw allow 80
ufw allow 443
ufw enable
Installation of web server
Now we will install PHP, Apache, MariaDB and all other required packages.
apt install vim apache2 mariadb-server libapache2-mod-php php php-gmp php-bcmath php-gd php-json php-mysql php-curl php-mbstring php-intl php-imagick php-xml php-zip bzip2 zip unzip imagemagick php-fpm redis-server php-redis php-fileinfo php-apcu ffmpeg
I use vim for editing files on the server. If your preference is something else you can remove vim
from the installation above.
Enable some Apache modules with:
a2enmod ssl rewrite headers proxy proxy_http deflate cache proxy_wstunnel http2 proxy_fcgi env
I have enabled http2
module too. If you want to use http2, click the link below to enable PHP-FPM for Apache.
Enable and start Apache
systemctl enable apache2
systemctl start apache2
Update PHP configuration
Before we jump in to create a database you might want to update some PHP settings in php.ini
.
vim /etc/php/7.4/apache2/php.ini
output_buffering = off (line 215)
max_execution_time = 120 (line 388)
memory_limit = 512M (line 409)
post_max_size = 100M (line 694)
upload_max_filesize = 100M (line 846)
date.timezone = Europe/London (line 962)
I have mentioned line numbers where you can find the settings. Change them accordingly for your needs. For timezone check out PHP timezone manual.
Database setup
We will secure the database 1st and then create nextcloud database.
/usr/bin/mysql_secure_installation
Follow the questions and set password, remove test database/user etc when asked.
Now let’s login to the database server:
mysql -u root -p
Enter root password when asked which you have set above. Run the following commands one by one to create nextcloud database, setup user and assign privileges.
create database nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
grant all on nextcloud.* to 'ncuser'@'localhost' identified by 'PASSWORD';
flush privileges;
exit
Change PASSWORD to a real strong password.
We are done with the initial setup, it’s time to download Nextcloud.
Download and setup Nextcloud
cd /var/www
wget https://download.nextcloud.com/server/releases/nextcloud-22.2.0.zip
unzip nextcloud-22.2.0.zip
rm -r /var/www/html/*
shopt -s dotglob
mv nextcloud/* html/
chown -R www-data:www-data /var/www/html
We will need proper permissions on Nextcloud directories and files, for that we will download and use a bash script. It’s from Nextcloud, so don’t worry about security etc.
wget https://github.com/nextcloud/vm/blob/master/static/setup_secure_permissions_nextcloud.sh
chmod +x setup_secure_permissions_nextcloud.sh
./setup_secure_permissions_nextcloud.sh
Once done remove the script for security sake.
rm setup_secure_permissions_nextcloud.sh
Apache configuration for Nextcloud
We will create nextcloud.conf
file in sites-available.
cd /etc/apache2/sites-available
vim nextcloud.conf
Paste the following in it:
<VirtualHost *:80>
ServerName DOMAIN.COM
ServerAlias www.DOMAIN.COM
DocumentRoot /var/www/html
<Directory "/var/www/html">
AllowOverride All
Options -Indexes +FollowSymLinks
</Directory>
ErrorLog /var/log/apache2/DOMAIN-error.log
CustomLog /var/log/apache2/DOMAIN-requests.log combined
</VirtualHost>
Change the words marked in bold.
Note: we will update this file later after getting a certificate.
Enable the site and restart Apache:
a2ensite nextcloud
systemctl restart apache2
You should now be able to access and see Nextcloud in the browser. But don’t start the installation yet.
Install certbot and get a certificate
To start with certbot and SSL setup, you can follow this article to install and get a certificate from Let’s Encrypt. Once you get the certificate successfully, it’s time to update nextcloud.conf
file. Final configuration will look like, make changes where applicable.
<VirtualHost *:80>
ServerName DOMAIN.COM
ServerAlias www.DOMAIN.COM
DocumentRoot /var/www/html
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
<Directory "/var/www/html">
AllowOverride All
Options -Indexes +FollowSymLinks
</Directory>
ErrorLog /var/log/apache2/DOMAIN-error.log
CustomLog /var/log/apache2/DOMAIN-requests.log combined
</VirtualHost>
<VirtualHost *:443>
ServerName DOMAIN.COM
ServerAlias www.DOMAIN.COM
DocumentRoot /var/www/html
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
<Directory "/var/www/html">
AllowOverride All
Options -Indexes +FollowSymLinks
</Directory>
ErrorLog /var/log/apache2/DOMAIN-error.log
CustomLog /var/log/apache2/DOMAIN-requests.log combined
SSLEngine on
SSLCertificateKeyFile /etc/letsencrypt/live/DOMAIN.COM/privkey.pem
SSLCertificateFile /etc/letsencrypt/live/DOMAIN.COM/fullchain.pem
</VirtualHost>
Restart Apache:
systemctl restart apache2
Final step
Now you can browse to the URL and install Nextcloud. Most of the information you will have already at hand like database credentials, data directory path(/var/www/html/data) etc.
If you go to Settings -> Overview
you may see the following. If there are things to fix, checkout the hacks and improvements guide.
There are still ways to improve this setup for example add Redis cache, move data directory. You can checkout the Nextcloud Hacks article for more details.