Setup Nextcloud with Portainer and nginx proxy manager
Learn how to ditch google, have your own open source drive.
Setup Nextcloud with Portainer and nginx proxy manager
Hello, today I'm going to teach how to install Nextcloud on a Debian machine, using Portainer to manage all your docker containers and nginx proxy manager, to have SSL connection.
For those who don't know about Nextcloud, I highly recommend taking a look at their page. It is an open source software that enables you to handle your data, for those who have concerns about privacy, and do not trust google, apple ... Nextcloud provides a way to you store your files and photos, manage your calendar, save contacts and much more... And it is free.
I will provide a GitHub with all the files you need to set up your Nextcloud instance.
For this tutorial, I'm assuming that you have already a domain and have set up your subdomains in your VPS manager.
Before we start, you need to open connections for ports, in your firewall.
- 81
- 9000
- 8080
After we set up nginx, we can close the connection on those ports and use only the subdomain that we will set up on nginx proxy manager.
Notes
I have chosen not to add here the content of the files to have a small post, and it is easier to open the GitHub and get the content of the file in case that you do not want to clone the hole repository.
Access the repository here.
Setup env files.
The .env files is where se setup the application secrets and some configurations. Do not modify the name of the variable, only the content.
Nextcloud
- Open the folder /nextcloud, and edit the file .env:
Define values for all the following attrs:
{user_password}
{db_user}
{db_password}
{redis_password}
{nc_admin_user}
{nc_admin_password}
{your.domain.com}
{timezone}
{db_password}
{db_user}
- Edit the file docker-compose.yml inside the folder /nextcloud;
{redis_password}
Nginx proxy manager
- Open the folder /npm, and edit the file .env;
Define values for all the following attrs:
{npm_db_password}
{npm_db_name}
{npm_db_user}
{npm_db_password}
Here we also deploy a MariaDB container, but this is only for nginx proxy manager to persist its data.
Installing Portainer
First we need to install docker, docker-compose and portainer on our machine.
Connect via ssh or use FileZilla or putty to upload the file. In this step, we will install all dependencies on your machine to run docker and Portainer.
Upload the script setup.sh to your machine;
Run the following commands:
To give permission to the file to be executable.
chmod +x setup.sh
Run the script to install all the dependencies, be aware that you will need to accept some terms.
./setup.sh
Wait until the installation finishes.
Open in your browser {your_vps_ip}:9000 and set up an admin account for Portainer.
Installing nginx proxy manager
Nginx proxy manager it is a container with an application that makes it easier to configure nginx, if you have knowledge and experience with nginx you can also configure using him directly, this is just a friendly UI.
In your Portainer;
Go to Stacks → + add stack → upload.
Select the file from my repository npm/docker-compose.yml;
Also upload the .env file.
Deploy the stack that you have created.
Open {your_vps_ip}:81, log with the following account and change your password after it.
admin@example.com
changeme
Here we will configure three domains, example:
- portainer.rodrigo.com.br → To access your Portainer application;
- cloud.rodrigo.com.br → To access your Nextcloud application;
- proxy.rodrigo.com.br → To access your nginx proxy manager application;
- office.rodrigo.com.br → To access your onlyoffice instance (you will not access directly this URL, nextcloud will use it);
In the future, I will improve this post with content on how to access Portainer and nginx using VPN only, to avoid unauthorized access.
Check the image on images/npm_hosts_example to see how it needs to be after you create the four hosts.
- Go to hosts → Proxy hosts and create a new one, this configuration is valid for all the four hosts
- Tab detail: Check Cache assets, block common exploits and web sockets support;
- Tab SSL: Force SSL, HTTP/2 and hosts enabled;
For Nextcloud, add the following lines to advanced tab, custom nginx configuration:
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_max_temp_file_size 16384m;
client_max_body_size 0;
location = /.well-known/carddav {
return 301 $scheme://$host:$server_port/remote.php/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host:$server_port/remote.php/dav;
}
- Now you should be able to access your Portainer and NPM application using the domains you just set up.
Installing Nextcloud
Go to Stacks → + add stack → upload.
Select the file from my repository npm/docker-compose.yml;
Also upload the .env file.
In your browser, open {your_vps_ip}:8080, just open the page and wait it load, Nextcloud will generate the config.php file;
In Portainer select the Nextcloud container and click on
exec a new console
, to connect to the Nextcloud container;
Run the following command to install vim and edit a config.php file, where we will add some configurations to Nextcloud;
apt-get update && apt-get install vim && vim config.php
- Add the following code to the config.php file;
'default_phone_region' => 'BR',
'trashbin_retention_obligation' => '30, 60',
'overwriteprotocol' => 'https',
'maintenance' => false,
'default_language' => 'pt_BR',
'default_locale' => 'pt_BR',
Save and restart the Nextcloud instance;
Type in your browser the domain that you have set up for Nextcloud, example: drive.rodrigo.com.br;
Set up an admin account and select MySQL/MariaDB
- Important, you need to click on Storage & Database to set up MySQL/MariaDB;
- Fill the database credentials, those same that you have set up before on the .env file;
- The last input is the IP to connect to your MariaDB container;
- You need to go back to Portainer and get the IP that was attached to the Nextcloud MariaDB container. {container_ip}:3306, do not forget to add the port 3306 at the end.
Now your Nextcloud is up and running, congratulations.
Setup systemd, to run scheduled jobs
Systemd enables Nextcloud to run periodic jobs, such as refresh your news feed. systemd deliveries a better performance than cron or ajax.
Note: You may want to change the default cron time, the default is 3 minutes, you can change it inside the file nextcloud-cron.timer, changing the variable OnUnitActiveSec.
Copy the files inside the /systemd folder to /etc/systemd/system/ in your host machine.
Run the following command to start the job on the system boot;
systemctl enable nextcloud-cron.timer
Run the following command to start the job at once;
systemctl start nextcloud-cron.timer
And run the following command to check the status;
systemctl status nextcloud-cron.timer
If you want to run the job to generate previews, you need to run the same commands for nextcloud-preview-generator.timer.
Adding only office
With only office you can have the same functionalities that you have on Google Drive to create slides, documents, sheets ...
Add a new stack onn portainer with the name onlyoffice and upload the docker-compose.yml inside the folder /onlyoffice;
Open nextcloud with your admin account, add the onlyoffice plugin;
Open setting menu and click on onlyoffice option;
Add your domain to ONLYOFFICE Docs address (domain that you previous setup on npm, office.rodrigo.com.br);
And to finish, you can change the configuration following the image only_office_example on /images;
Now you can create a new doc example and test your onlyoffice application.
Important notes
In case that you have problems to set up your domain at NPM, be aware that for each domain, example: nextcloud.rodrigo.com.br you have a limit of 5 certificates within 168 hours. So let's encrypt will generate only five SSL certificates, if you reach the limit you need to test with a different subdomain.