I recently came across NextCloud Hub server (free on self-hosted servers) and I wanted to set up my own private cloud server to store my own files.
I wan’t to be able to access my files on Windows, Mac, Android and iOS.
Most of all I want a place in the cloud (that I own) that I can upload my Acronis backup of C Drive as the Backblaze client (read my review of Backblaze here) is a bit slow at uploading a 150GB backup file to the USA.
To create my own Nextcloud server I will need to login to these services.
- I logged into my Domain Name provider porkbun.com (to ensure I had a domain name)
- I logged into Cloudflare.com (to manage my DNS for a subdomain (redirected from PorkBun)).
- I logged into my UpCloud.com account. (to deploy a new virtual machine)
Fyi: If you don’t have a favourite virtual machine provider you can use my referral link to obtain $25 free credit (only if you are new to UpCloud). Every new user who signs up with my referral link will receive a $25 bonus to get started. That’s 5 months free server (1 CPU and 1GB memory Linux server)
Post Index
- NextCloud System Requirements
- Creating a new Virtual Machine at UpCloud
- Updating Ubuntu
- Installing Common Software Packages
- Securing SSH with the Google Authentication PAM module
- Installing a Firewall
- Installing NGINX and DNS
- Installing PHP/PHP-FPM
- Installing MySQL
- Nixstats
- CronTab Updates
- Misc Security Stuff
1. NextCloud System Requirements
I checked the NextCloud version 18 system requirements and it needs the following to deploy.
- Ubuntu 18.04 LTS (recommended)
- MySQL 5.7+ or MariaDB 10.2+ (recommended)
- Nginx with php-fpm
- PHP 4 (recommended)
Minimum Memory Requirements
Nextcloud needs a minimum of 128MB RAM, and they recommend a minimum of 512MB.
I can deploy a server with at least 512MB memory free. The minimum UpCloud server I can deploy comes with 1GB of memory for $5 a month.
Time to create a new server.
2. Creating a new Virtual Machine at UpCloud
I logged into UpCloud and clicked “Deploy Server“
I selected Singapore as the place to deploy my new server (as it was closest to me here in Australia). UpCloud does not have servers here in Australia yet.
I checked https://wondernetwork.com/pings/ to ensure Singapore is the fastest location near. My server https://fearby.com is located in Chicago as it’s closer to my average readers and search engines.
I would like my NextCloud server to be as fast as possible to me. Singapore is the faster UpCloud datacenter near me.
I selected a server with 1 CPU Core, 1GB of Memory, 25GB of storage and 1TB of network traffic. I will add a 500GB drive to this server for additional storage.
If the server needs more resources I will upgrade it later.
The only downside of a $5/m server is the 1TB network quota. If I overuse the network (downloads) I will get an extra charge.
I reached out to the support to verify the costs if I go over my quota.
My question to UpCloud chat support.
Q1) With a $5/m server with 1TB quota what is the over charge costs if I go over 1TB
Q2) Is 1TB quota up and down or just down?
Prompt Answer
Hi Simon,
Good to speak to you again.
A1) Only Simple plans include monthly allowance of outgoing network traffic. After the allowance, the cost is $0.01/GB. It was a lot higher, but we reduced it to make it more competitive.
A2) The quota is for outgoing network traffic from your servers, all incoming and private traffic between your UpCloud servers is free of charge.
Regards,
~Long Lam
I hope this is helpful, let us know if you have any further questions.
Based on this information if I use all of my 1TB Monthly quota downloading files and I download and extra 150GB (e.g A 150GB Acronis backup image) it will cost $1.5 extra. That’s not bad.
UpCloud Chat Support
Before I selected a server type (Simple or Flexible) or storage type (MAX IOPS or HDD) I jumped onto the UpCloud chat and asked a few questions.
Q1) Hello, When deploying a server is there a cost difference between MAX IOPS and HDD storage? I am looking at a 500GB drive
A1) Storage (MaxIOPS), per GB $0.00031/ hourly $0.22/ monthly, Storage (HDD), per GB $0.000078/hourly $0.06 / monthly
Q2) What’s the difference between Simple and Flexible?
A2) Flexible will/turn out more expensive depending on your use case, generally, it is more suited for short term deployments.
UpCloud has very responsive and helpful chat staff. I never had this level of help with Vultr, Digital Ocean or AWS.
After I chatted with UpCloud support I decided to deploy a simple (Ubuntu 18.04) Server with 1 CPU Core, 1TB network traffic, 1GB of memory, 25GB system drive and an extra 500GB storage device.
When you create a server you can add an extra storage device. Nice.
When adding an extra storage device you can choose faster MaxIOPS storage or slower HDD based storage.
I will choose HDD storage as it will be cheaper for a 500GB device.
I created a 500GB storage device for a Nextcloud data drive.
You can create up to 2TB storage devices with UpCloud.
I selected Ubuntu 18.04 LTS as the operating system.
I configured a login method as “Only SSH Keys” as I have already added my SSH key with a passphrase.
I selected my SSH key.
If you have not previously added an SSH Key to UpCloud then click Add new. Read more here.
I selected an Initialisation script I previously created (that just outputs a “Hello World” to a text file). One day I will create an Ansible or Terraform script to set up a server.
I clicked Deploy
Fyi: If you don’t have a favourite virtual machine provider you can use my referral link to obtain $25 free credit (only if you are new to UpCloud). Every new user who signs up with my referral link will receive a $25 bonus to get started. That’s 5 months free server (1 CPU and 1GB memory Linux server).
I entered my desired hostname
I had a notification that the UpCloud Deploy is being deployed..
I could see in my UpCloud dashboard that the server was being deployed.
Server deploy is underway
Wow that took a whole minute to deploy a 525GB Server.
Wow UpCloud are fast
Configuring the server with Putty
Now it is time to connect to the Ubuntu Servers CLI and configure the server. I grabbed the IP address that was listed at UpCloud.
I opened Putty and added the IP address for the server.
Under the Auth section in Putty I added the path to my SSH Private Key (the same one that configured in the new server)
I saved the connection and clicked Open. I clicked Yes to the SSH fingerprint when I verified it was correct.
I now had root access to my new server.
Time to update Ubuntu.
3. Updating Ubuntu
I ran this command to update Ubuntu.
sudo apt-get update && sudo apt-get upgrade
Confirming the 2x storage disks
I ran this command to verify I had the 2 storage devices I selected at server deploy.
sudo lsblk |grep disk
vda 252:0 0 25G 0 disk
vdb 252:16 0 500G 0 disk
Yes, I have a 25GB disk and a 500GB disk
4. Installing Common Software Packages
I installed these packages
sudo apt-get install htop
sudo apt-get install lshw
sudo apt-get install ufw
sudo apt-get install ncdu
sudo apt-get install nmap
sudo apt-get install iozone3
sudo apt install pydf
sudo apt install mc
sudo apt install nnn
5. Securing SSH with the Google Authentication PAM module
Before I carry on any further I need to enable hardware 2FA login protections to all SSH logins. I will follow the guide I created here (Setup two factor authenticator protection at login on Ubuntu or Debian).
Warning: Take a backup of your server first. If you set this up wrong say bye-bye to your server. If I lose my YubiCo YubiKey and forget my backup codes I will have a hard time getting back in.
I will force all SSH logins to require my Hardware YubiCo YubiKey to be inserted (to generate a temporary One Time Password (OTP)).
You don’t need a YubiCo YubiKey, a generic software authentication app is OK but I prefer hardware devices as they are more secure.
I set the timezone to match Australia/Sydney. If I enabled a 2FA (OTP) at login with a different timezone than my connecting machine I would never be able to login to my server as my server and local PC need to be in the same timezone.
I ran this command to set the time in Ubuntu.
pkg-reconfigure tzdata
I then checked the time
sudo hwclock --show
2020-05-31 23:17:02.873751+1000
I installed the Google Authentication PAM Module (read more)
sudo apt install libpam-google-authenticator
I ran this command to configure the Google PAM Module
google-authenticator
I was presented with these questions
Do you want authentication tokens to be time-based (y/n) y
I was presented with a secret key, verification code and backup codes (I saved these somewhere safe)
Do you want me to update your “/root/.google_authenticator” file? (y/n) y
Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n) yBy default, a new token is generated every 30 seconds by the mobile app.
In order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. This allows for a time skew of up to 30 seconds between authentication server and client. If you experience problems with poor time synchronization, you can increase the window from its default size of 3 permitted codes (one previous code, the current code, the next code) to 17 permitted codes (the 8 previous codes, the current
code, and the 8 next codes). This will permit for a time skew of up to 4 minutes between client and server.Do you want to do so? (y/n) y
If the computer that you are logging into isn’t hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
By default, this limits attackers to no more than 3 login attempts every 30s.Do you want to enable rate-limiting? (y/n) y
I can review all config values later with this command
sudo nano ~/.google_authenticator
Now I will enable 2FA at login by editing this file
sudo nano /etc/pam.d/sshd
I searched for “@include common-auth” then added this line after it.
auth required pam_google_authenticator.so
I then comment out the following line (this is the most important step, this forces 2FA)
#@include common-auth
Picture of my /etc/pam.d/sshd changes
I saved the file /etc/pam.d/sshd
Now I can enable the PAM Module by editing this file
sudo nano /etc/ssh/sshd_config
I searched for
ChallengeResponseAuthentication
And change the value to “yes”
I ensured the following line exists
UsePAM yes
I added this line then saved /etc/ssh/sshd_config
AuthenticationMethods publickey,password publickey,keyboard-interactive
Now I edited /etc/pam.d/common-auth
sudo nano /etc/pam.d/common-auth
I added the following line before the line that says “auth [success=1 default=ignore] pam_unix.so nullok_secure”
auth required pam_google_authenticator.so
Now I can restart the SSH Service and test the
/etc/init.d/ssh restart
[ ok ] Restarting ssh (via systemctl): ssh.service.
I restarted my putty session and reconnected to my server and I was prompted for the password for my private key and the randomly generated one-time password that was linked to my YubiCo YubiKey. Nice
Now I need to whitelist my SSH port to select IP’s.
6. Installing a Firewall
I installed the UFW firewall by typing this command
sudo apt-get install ufw
I configured UFW to rate limit SSH logins by typing this command
sudo ufw limit ssh comment 'Rate limit hit for openssh server'
Rules updated
Rules updated (v6)
I configured some common ports
sudo ufw allow ssh/tcp
sudo ufw logging on
sudo ufw allow http
sudo ufw allow https
sudo ufw allow 22
sudo ufw allow 53
sudo ufw allow 80
sudo ufw allow 443
sudo ufw allow 873
I added Cloudflare firewall rules (as my domain is behind their firewall and I will remove all direct IP access to my server later)
sudo ufw allow from 173.245.48.0/20
sudo ufw allow from 103.21.244.0/22
sudo ufw allow from 103.22.200.0/22
sudo ufw allow from 103.31.4.0/22
sudo ufw allow from 141.101.64.0/18
sudo ufw allow from 108.162.192.0/18
sudo ufw allow from 190.93.240.0/20
sudo ufw allow from 188.114.96.0/20
sudo ufw allow from 197.234.240.0/22
sudo ufw allow from 198.41.128.0/17
sudo ufw allow from 162.158.0.0/15
sudo ufw allow from 104.16.0.0/12
sudo ufw allow from 172.64.0.0/13
sudo ufw allow from 2400:cb00::/32
sudo ufw allow from 2405:8100::/32
sudo ufw allow from 2405:b500::/32
sudo ufw allow from 2606:4700::/32
sudo ufw allow from 2803:f800::/32
sudo ufw allow from 2c0f:f248::/32
sudo ufw allow from 2a06:98c0::/29
I added appropriate Whitelisted IP’s that can connect to Port 22 (SSH), removed blanket port 22 access and I configured my firewall to allow 91 incoming and outgoing rules (this is a secret)
I reloaded and enabled the firewall.
sudo ufw reload
sudo ufw disable
sudo ufw enable
7. Installing NGINX and DNS
I update Ubuntu again
sudo apt-get update && sudo apt-get upgrade
I installed Nginx
sudo apt-get install nginx
I edited my NGINX config and I change the default www folder location.
I also configured the log file location, mime types, max body size, gzip, default ports, ssl cert paths, security headers, default page, server name, sensitive file block rules, dns server, cache headers etc.
Read more to here to configure Nginx etc.
Fyi: Nginx config file locations
sudo nano /etc/nginx/nginx.conf
sudo nano /etc/nginx/sites-available/default
I typed my servers IP address into a web browser
I created an index.html file in the www folder and added “Hello World” to the file.
If I type my server’s IP address into a browser I can see this file.
My DNS is with Cloud flare so I logged in and added 2 DNS entries (IPv4 and IPv6) that direct traffic my new server IP(s) for this subdomain. To obtain the IP addresses I logged into UpCloud and clicked my server then clicked Network and noted my IPv4 and IPv6 addresses.
I then went to Cloudflare and added a DNS record for IPv4 and IPv6 pointing to my servers IP(s). I enabled Cloudflare Proxying to allow Cloud flare to try and hide the IP of the server. I then configured my firewall to block access to the IP except via Cloudflare and my whitelist.
I then checked for worldwide DNS propagation with https://www.whatsmydns.net/. After 3 minutes my DNS changes were all around the world. Thanks, Cloudflare.
I tried loading my site but CLiudflare said it was down.
I created a new HTTPS certificate at Cloud flare just to be sure and added it to my sites.
After investigating further I found this was because my primary website has a “Strict-Transport-Security header and I had enabled Full (Strict) SSL/TLS Encryption. I changed this to Full at Cloudflare.
My site was now working.
8. Installing PHP/PHP-FPM
To Install PHP 7.4 I ran this command to be able to get the latest version of PHP
sudo apt-get update
sudo apt -y install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
I installed PHP 7.4 with this command
sudo apt -y install php7.4
I checked that PHP is installed by running
php -v
PHP 7.4.6 (cli) (built: May 14 2020 10:02:44) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.6, Copyright (c), by Zend Technologies
I setup some PHP Modules
sudo apt install php7.4-common php7.4-mysql php7.4-xml php7.4-xmlrpc php7.4-curl php7.4-gd php7.4-imagick php7.4-cli php7.4-dev php7.4-imap php7.4-mbstring php7.4-soap php7.4-zip php7.4-bcmath php7.4-tidy
I noticed apache2 installed (and broke my Nginx) so I uninstalled it.
sudo apt-get remove apache2
I also blocked apache from installing again
apt-mark hold apache2
apache2 set on hold.
I checked to make sure Apache was blocked from installing
apt-mark hold apache*
apache2 was already set on hold.
apache2-bin set on hold.
apache2-utils set on hold.
apache2-data set on hold.
apache2-doc set on hold.
apache2-suexec-pristine set on hold.
apache2-suexec-custom set on hold.
apache2-dbg set on hold.
apache2-dev set on hold.
apache2-ssl-dev set on hold.
apachedex set on hold.
apacheds set on hold.
apachetop set on hold.
Now I will install PHP-FPM.
FPM is a process manager to manage FastCGI in PHP
sudo apt-get install php7.4-fpm
I checked the status of the PHP FPM service with
sudo service php7.4-fpm status
Output
php7.4-fpm.service - The PHP 7.4 FastCGI Process Manager
Loaded: loaded (/lib/systemd/system/php7.4-fpm.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2020-06-06 21:34:31 AEST; 1min 54s ago
Docs: man:php-fpm7.4(8)
Process: 7767 ExecStopPost=/usr/lib/php/php-fpm-socket-helper remove /run/php/php-fpm.sock /etc/php/7.4/fpm/pool.d/www.conf 74 (code=exited, status=0/SUCCESS)
Process: 7772 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/7.4/fpm/pool.d/www.conf 74 (code=exited, status=0/SUCCESS)
Main PID: 7769 (php-fpm7.4)
Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
Tasks: 3 (limit: 1147)
CGroup: /system.slice/php7.4-fpm.service
|-7769 php-fpm: master process (/etc/php/7.4/fpm/php-fpm.conf)
|-7770 php-fpm: pool www
`-7771 php-fpm: pool www
I might add some PHP child workers if I add more CPU’s to this server later
I edited my php.ini
sudo nano /etc/php/7.4/fpm/php.ini
I made these changes to php.ini
file_uploads = On
allow_url_fopen = On
memory_limit = 512M
post_max_size = 50M
upload_max_filesize = 50M
cgi.fix_pathinfo = 0
max_execution_time = 360
date.timezone = Australia/Sydney
I added read this page (Nginx Configuration) and edited my /etc/nginx/sites-enabled/default
I tested and reloaded the Nginx config and restarted NGINX and PHP
nginx -t
nginx -s reload
sudo systemctl restart nginx.service
sudo systemctl restart php7.4-fpm
sudo systemctl status nginx.service
sudo systemctl status php7.4-fpm
To test PHP FPM I created a php file in my website root and added the following text
<?php phpinfo( ); ?>
I loaded this file in a browser and I confirmed that PHP-FPM was installed.
The test was ok (I deleted this test file), I deleted the index.html and created an index.php file
9. Installing MySQL
To install MySQL I ran the following command
fyi: All usernames and database names are for example only.
sudo apt install mysql-server
I configured MySQL With this command
sudo mysql_secure_installation
Securing the MySQL server deployment.
Connecting to MySQL using a blank password.
...
Would you like to setup VALIDATE PASSWORD plugin?
y
There are three levels of password validation policy:
STRONG
Please set the password for root here.
New password:
**************************************************
Re-enter new password:
**************************************************
Estimated strength of the password: 100
Do you wish to continue with the password provided?
y
Remove anonymous users?
y
Disallow root login remotely?
y
Remove test database and access to it?
y
Reload privilege tables now?
y
Now to test MySQL I will login to it
sudo mysql -u root -p
************************************************************
Now I ran the following to create a database for Nextcloud
mysql> CREATE DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Query OK, 1 row affected (0.00 sec)
I verified the database was created
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| databasename |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
I created a database user
mysql> CREATE USER 'username'@'localhost' IDENTIFIED BY '************************************';
Query OK, 0 rows affected (0.00 sec)
I verified the use was created with this command
mysql> SELECT User,Host FROM mysql.user;
+------------------+-----------+
| User | Host |
+------------------+-----------+
| **************** | localhost |
| **************** | localhost |
| **************** | localhost |
| username | localhost |
| **************** | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)
I set permissions to add the user to the database
mysql> GRANT ALL PRIVILEGES ON `databasename`.* TO 'username'@'localhost';
Query OK, 0 rows affected (0.00 sec)
I verified the permissions with this command
mysql> SHOW GRANTS FOR 'username'@'localhost';
+--------------------------------------------------------------------------+
| Grants for username@localhost |
+--------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'username'@'localhost' |
| GRANT ALL PRIVILEGES ON `databasename`.* TO 'username'@'localhost' |
+--------------------------------------------------------------------------+
2 rows in set (0.00 sec)
Finally I flushed permissions
mysql> FLUSH PRIVILEGES;
Now the databases is ready for Nextcloud
10. Nixstats
If you do not know what Nixstat’s is check out my post here Monitor server performance with NixStats and receive alerts by SMS, Push, Email, Telegram etc
I logged into Nixstats and click Add Server. I ran the provided install command.
wget -q -N --no-check-certificate https://nixstats.com/nixstatsagent.sh && bash nixstatsagent.sh ################## ##########################
Todo: Configure Nixstats PHP-FPM and NGINX Reporting (work in progress). My firewall rules are too tight for this install.
Handy Links
11. CronTab Updates
I created a update.sh file that I can call from a crontab entry to update Ubuntu and other software every xx hours.
I added this to my crontab.
12. Misc Security Stuff
I made sure my firewall only allowed traffic to my server was from Cloudflare IP’s and Whitelisted IP’s
Cloud flare IP’s can be found here.
https://www.cloudflare.com/ips-v4/
https://www.cloudflare.com/ips-v6/
At the time of writing the IP’s are
173.245.48.0/20
103.21.244.0/22
103.22.200.0/22
103.31.4.0/22
141.101.64.0/18
108.162.192.0/18
190.93.240.0/20
188.114.96.0/20
197.234.240.0/22
198.41.128.0/17
162.158.0.0/15
104.16.0.0/12
172.64.0.0/13
131.0.72.0/22
2400:cb00::/32
2606:4700::/32
2803:f800::/32
2405:b500::/32
2405:8100::/32
2a06:98c0::/29
2c0f:f248::/32
I blocked access to my webserver (port 80 and 443) to anyone but Cloudflare.
I whitelisted DNS traffic to only Up Cloud. Thanks, Lon.
Up Cloud support is awesome.
Installing NextCloud
Finally I can Install Nextcloud, I navigated to https://nextcloud.com/install/ and clicked Download for Server
I will use the Web installer to Install Nextcloud.
Nextcloud web installer instructions
Snip about the Nextcloud Installer from the download page
The Web Installer is the easiest way to install Nextcloud on a web space. It checks the dependencies, downloads Nextcloud from the official server, unpacks it with the right permissions and the right user account. Finally, you will be redirected to the Nextcloud installer.
1) Right-click here and save the file to your computer
2) Upload setup-nextcloud.php to your web space
3) Point your web browser to setup-nextcloud.php on your webspace
4) Follow the instructions and configure Nextcloud
5) Login to your newly created Nextcloud instance!
You can find further instructions in the Nextcloud Admin Manual.
Note that the installer uses the same Nextcloud version as available for the built in updater in Nextcloud. After a major release it can take up to a month before it becomes available through the web installer and the updater. This is done to spread the deployment of new major releases out over time.
I used WinSCP to upload the setup-nextcloud.php to my Nginx web root folder
I loaded the setup-nextcloud.php file from, my web browser.
I entered “.” to install Nextcloud to the website root.
There is no way Nextcloud installed in 2 seconds, I checked the size of the disk usage in my website root.
sudo du -hs /web-root
313M
Nextcloud took about 10 seconds to download 313MB onto my UpCloud Server.
Fyi: I installed the SpeedTest CLI app and ran a benchmark and UpCloud Chicago can download as 937Mbps/sec and UpCloud Singapore can download at 717Mbps/sec.
Now I need to enter the data root folder for Nextcloud . I installed lswh to be able to see my 500GB disk.
sudo apt-get install lshw
I ran the following to see my disks
sudo lshw -class disk -short
H/W path Device Class Description
=================================================
********** /dev/vda disk 26GB Virtual I/O device
********** /dev/vdb disk 536GB Virtual I/O device
I formatted my disk
sudo mkfs.ext4 /dev/vdb
I created a new folder under mount to connect to the partition. The folder name is a made-up sample
sudo mkdir -p /mnt/foldername
I mounted the partition to the folder
sudo mount /dev/vdb /mnt/foldername
I made sure Nginx can access the folder
sudo chown -R www-data:www-data /mnt/foldername
I changed to the partition mount
cd /mnt/foldername
I created a test 490GB file
fallocate -l 490G test.file
I checked the file
ls -al
-rw-r--r-- 1 username useername 526133493760 Jun 9 19:38 test.file
I deleted this test file and set this mount point as the data file in Nextcloud setup.
I added a new Nextcloud admin username and password, mount folder for Nextcloud data folder, the SQL database user/password/database name and host and clicked Finish Setup
Nextcloud was setup.
Misc Setup
I ran the /settings/admin/overview report to see if I needed to perform andy final setup steps. I have a few missing php modules and a few optimisation tasks that need resolving.
Links to resolve.
Nextcloud External Security Scan
I loaded https://scan.nextcloud.com/ to perform a external security scan.
Scan Results
Adding Two-Factor Authentication (YubiKeys)
I noticed in the Nextcloud security setting page I can setup a YubiKey as a pass-wordless login device.
This would allow me to insert my YubiKey to login automatically
I added my YubiKey and gave it a name.
The password-less login method is a bit insecure as anyone that has my YubiKey can access my site.
I think I will set up a Two-Factor Authentication/OTP login method and link that to my YubiKey. I visited the /settings/apps/security page and installed the Two-Factor TOTP Provider app.
I clicked the checkbox next to TOTP
The app generated a QR code that my YubiCo Authentication App can use to link to Nectcloud
I verified the QR scan and entered the 6 number verification code from my YubiCo Authenticator app
Two Factor logins are now enabled.
Now after I log in I have to enter a temporary 6 digit number that is only valid for 30 seconds (and only after entering my YubiCo YubiKey into my PC and entering its password)
Nice
Nextcloud Overview
I logged into Nextcloud and was greeted with a wizard.
The sample images in the welcome screen are a bit small.
I can add native apps to Windows, Mac, iOS and Android or I can log in via the web page.
Pointers to the manual, community help and forums.
Main screen is clean.
A user context Menu is linked in the top right.
I setup email alerts (I allowed outgoing ports in my firewall)
sudo ufw allow out 465/tcp
sudo ufw allow out 465/udb
I used my GSuite account to send emails.
Syncing Files from my PC to Nextcloud
I tried uploading my 150GB Acronis Backup image file to Nextcloud by the web interface but this will fail for sure, this will take many hours.
I decided to configure Acronis True Image to split backups into 100MB chunks.
I created another Acronis image of my Windows Drive.
Nextcloud Windows App
I visited https://nextcloud.com/install/ and installed the Nextcloud Windows app to sync files.
I clicked Windows
Click Next
Click Next
Click Install
Nextcloud sync app is now installing
Next cloud sync is now installed.
Click Log in
Enter your Nextcloud server https address and click Next
A web browser login screen appeared and I logged in
After I logged in Nextcloud sync was connected
I was prompted to sync everything online to my local PC or choose folders to Sync .
All files that were in Nextcloud synced down (that I selected)
I set Nextcloud to start at Windows start.
I reviewed Download and Upload limits
I decided to add my U:\AcronisBackup folder to my Nextcloud server.
I was asked to add this to a remote Nextcloud folder.
Files were backing up.
I could see each 100MB section of the Acronis Backup appearing in the Nextcloud web app.
I noticed that the raw file system list of files was about 30 seconds ahead of the web list.
I had an Alert from my Acronis Backup software that new backup files were downloading.
The Acronis backup folder started backing up but I noticed it was redownloading to a new folder. I don’t want this.
I paused the Nextloud Sync and my 150GB Backup was re-downloading to a new folder.
It looks like U:\AcronisBackup was backing up then downloading to U:\Nextcloud\Simon\AcronisBackup.
I moved my Acronis backup from U:\AcronisBackup to U:\Nextcloud\Simon\ZENigma (ZENnigma is the name of my PC)
I deleted the old sync of U:\AcronisBackup and started the Nextcloud Sync again
Now my Acronis backup (150GB) was backing up to Nextcloud.
It took 24 hours to backup 150GB from my PC to my server in Singapore.
I can see a handy summary of synced files and disk space used/free.
I can control the sync with a System Tray App.
Nextcloud Conclusion
Pros
- Free
- Works well.
- I have an offsite location for backups and an area for file sharing with my family
- Faster than Backblaze and Dropbox
Cons
- Needs better Hardware 2FA support
- Some Nextcloud web pages are not mobile-friendly (e.g add new user)
- Needs better post install security checks
- Web view of files could be updated more often, there is as 30-second delay between the web list of files and a CLI list in Putty of /mnt/foldername/username/files/
Troubleshooting
NGINX website is not loading
Check to see if a package has downloaded apache (this will take out Nginx).
Also, make sure you have set permissions on the folder that holds your SSL Certificates and allow your Nginx www-data user read access.
sudo chown -R www-data:www-data /etc/nginx/https-cert/
Deleting a MySQL Database
I had an issue where Nextcloud did not like the database I created so I ran the following to revoke the database users permissions, remove the user and I deleted the database.
Command to revoke the users MySQL permissions
sudo mysql -u root -p
*************************************
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'databaseusername'@'localhost';
Delete the MySQL user
sudo mysql -u root -p
Enter password: *************************************
mysql> DROP USER 'databaseusername'@'localhost';
I reset flushed permissions
sudo mysql -u root -p
Enter password: *************************************
mysql>
FLUSH PRIVILEGES;
To delete the database run the following.
mysqladmin -u root -p drop databasename
Enter password: *************************************
Dropping the database is potentially a very bad thing to do.
Any data stored in the database will be destroyed.
Do you really want to drop the 'databasename' database [y/N] y
Database "databasename" dropped
Thanks for Reading
Fyi: If you don’t have a favourite virtual machine provider you can use my referral link to obtain $25 free credit (only if you are new to UpCloud). Every new user who signs up with my referral link will receive a $25 bonus to get started. That’s 5 months free server (1 CPU and 1GB memory Linux server)
v1.1