Nextcloud Docker Setup
This is how I set up my nextcloud
Prerequisites:
- Arch based distro
- Domain name
Steps:
- Install docker and docker-compose
- Start Nextcloud for the first time
- Systemd unit creation
- (Optional) Make known to public!!
Make sure ports 80 and 443 are exposed, either through port forwarding or through your firewall.
Install docker and docker-compose
Install the packages:
sudo pacman -S docker docker-compose
Enable the docker systemd service:
sudo systemctl enable --now docker
Add yourself to the docker user group so that you don’t have to use sudo every time
sudo usermod -aG docker <your username>
Reboot your computer.
Nextcloud Docker Set-Up
Next step is creating and configuring the Nextcloud docker-compose.
First, you’ll have to create folders in which your nextcloud files and redis cache are stored. This can be anywhere on your computer. The folders should be named config
custom_apps
ncdata
and redis
. On my home server, they are all stored in a folder called nextcloud
on a separate drive.
Next, choose a location to store the docker-compose file. I keep mine in my home folder, in Projects/nextcloud
.
Next, to to the folder where you want to store the docker-compse file, and then create a docker-compose file.
vim docker-compose.yml
Then add the following, making sure to replace values between <>
version: '2'
volumes:
nextcloud:
db:
networks:
nextcloud_network:
external: false
services:
db:
image: mariadb
restart: unless-stopped
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW --innodb-file-per-table=1 --skip-innodb-read-only-compressed
volumes:
- db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=<password>
- MYSQL_PASSWORD=<password>
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
networks:
- nextcloud_network
app:
image: nextcloud:latest
restart: unless-stopped
ports:
- 8080:80
links:
- db
volumes:
- <path to nextcloud/ncdata>:/var/www/html/data
- <path to nextlcoud/config>:/var/www/html/config
- <path to nextcloud/custom_apps>:/var/www/html/custom_apps
environment:
- MYSQL_PASSWORD=<password>
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_HOST=db
- REDIS_HOST=redis
networks:
- nextcloud_network
redis:
image: redis:alpine
container_name: redis
volumes:
- <path to redis folder>:/data
networks:
- nextcloud_network
restart: unless-stopped
After that, run the command docker-compose up -d
to start the docker.
Systemd Service Creation
A systemd service is a nice-to-have that will automatically start the docker upon reboot, and it should pull the latest nextcloud image every time. To create the systemd service, create the file /etc/systemd/system/nextcloud-docker.service
sudo vim /etc/systemd/system/nextcloud-docker.service
Now paste in the following:
[Unit]
Description=Nextcloud docker using docker-compose
Requires=docker.service
After=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/home/johann/Projects/nextcloud
ExecStart=/usr/bin/docker-compose up -d
ExecStop=/usr/bin/docker-compose down
TimeoutStartSec=0
[Install]
WantedBy=multi-user.target
Save and quit, and enter in the following command to make systemd reload the unit/service configuration:
systemctl daemon-reload
And now you can enable the service nextcloud-docker
systemctl enable nextcloud-docker
You should be all done now, enjoy Nextcloud with full caching support :)
Make known to public!
Install caddy and add this configuration to /etc/caddy/conf.d/nextcloud
<domain name> {
rewrite /.well-known/carddav /remote.php/dav
rewrite /.well-known/caldav /remote.php/dav
reverse_proxy 127.0.0.1:8080
}
When using caddy, you are technically accessing nextcloud over the http port, but because of caddy you are using https. This can confuse nextcloud.
To force the protocol Nextcloud broadcasts, edit config.php
in the folder where you are storing your nextcloud configuration files (the config
folder) and add the following to the bottom section of the configuration file:
'overwriteprotocol' => 'https',
This should mainly resolve the issue of not being able to connect your phone to nextcloud.