You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

359 lines
12 KiB
Markdown

5 years ago
# Nextcloud in docker
4 years ago
###### guide-by-example
5 years ago
5 years ago
![logo](https://i.imgur.com/VXSovC9.png)
5 years ago
4 years ago
# Purpose & Overview
5 years ago
5 years ago
File share & sync.
5 years ago
5 years ago
* [Official site](https://nextcloud.com/)
* [Github](https://github.com/nextcloud/server)
* [DockerHub](https://hub.docker.com/_/nextcloud/)
5 years ago
2 years ago
Nextcloud is an open source software for sharing files, calendar, general office
collaboration stuff. Most people know it and use it as an alternative
to onedrive/google drive.
4 years ago
The Nextcloud server is written in PHP and JavaScript.
For remote access it employs sabre/dav, an open-source WebDAV server.
2 years ago
It is designed to work with most of the databases.
4 years ago
There are many ways to deploy Nextcloud, this setup is going with the most goodies.</br>
4 years ago
Using [PHP-FPM](https://www.cloudways.com/blog/php-fpm-on-cloud/)
for better performance and using [Redis](https://aws.amazon.com/redis/)
for more reliable
4 years ago
[transactional file locking](https://docs.nextcloud.com/server/latest/admin_manual/configuration_files/files_locking_transactional.html)
and for [memory file caching](https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/caching_configuration.html).
4 years ago
# Files and directory structure
5 years ago
4 years ago
```
4 years ago
/home/
└── ~/
└── docker/
└── nextcloud/
2 years ago
├── 🗁 nextcloud_data/
├── 🗁 nextcloud_db_data/
2 years ago
├── 🗋 .env
├── 🗋 docker-compose.yml
├── 🗋 nginx.conf
└── 🗋 nextcloud-backup-script.sh
4 years ago
```
5 years ago
2 years ago
* `nextcloud_data/` - users actual data and web app data
* `nextcloud_db_data/` - database data - users and files metadata, configuration
4 years ago
* `.env` - a file containing environment variables for docker compose
4 years ago
* `docker-compose.yml` - a docker compose file, telling docker how to run the containers
4 years ago
* `nginx.conf` - nginx web server configuration file
2 years ago
* `nextcloud-backup-script.sh` - a backup script, to be run daily
4 years ago
You only need to provide the files.</br>
The directories are created by docker compose on the first run.
4 years ago
# docker-compose
5 years ago
Official examples [here](https://github.com/nextcloud/docker/tree/master/.examples/docker-compose)
4 years ago
Five containers to spin up
4 years ago
4 years ago
* **nextcloud-app** - nextcloud backend app that stores the files and facilitate
2 years ago
the sync and runs the apps(calendar, notes, phonetrack,...)
* **nextcloud-db** - mariadb database storing files-metadata and users-metadata
4 years ago
* **nextcloud-web** - nginx web server with fastCGI PHP-FPM support
2 years ago
* **nextcloud-redis** - in memory file caching and more reliable transactional
file locking
4 years ago
* **nextcloud-cron** - for periodic maintenance in the background
5 years ago
2 years ago
Note that `nextcloud_data` is mounted in 3 containers.
4 years ago
`docker-compose.yml`
```yml
version: '3'
services:
nextcloud-db:
image: mariadb
container_name: nextcloud-db
hostname: nextcloud-db
3 years ago
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW --innodb_read_only_compressed=OFF
4 years ago
restart: unless-stopped
4 years ago
env_file: .env
4 years ago
volumes:
2 years ago
- ./nextcloud_data_db:/var/lib/mysql
4 years ago
nextcloud-redis:
2 years ago
image: redis:alpine
4 years ago
container_name: nextcloud-redis
hostname: nextcloud-redis
restart: unless-stopped
4 years ago
nextcloud-app:
image: nextcloud:fpm-alpine
container_name: nextcloud-app
hostname: nextcloud-app
4 years ago
restart: unless-stopped
4 years ago
env_file: .env
4 years ago
depends_on:
- nextcloud-db
- nextcloud-redis
volumes:
2 years ago
- ./nextcloud_data/:/var/www/html
4 years ago
4 years ago
nextcloud-web:
image: nginx:alpine
container_name: nextcloud-web
hostname: nextcloud-web
restart: unless-stopped
volumes:
2 years ago
- ./nextcloud_data/:/var/www/html:ro
4 years ago
- ./nginx.conf:/etc/nginx/nginx.conf:ro
2 years ago
expose:
- 80:80
4 years ago
4 years ago
nextcloud-cron:
4 years ago
image: nextcloud:fpm-alpine
4 years ago
container_name: nextcloud-cron
hostname: nextcloud-cron
restart: unless-stopped
volumes:
2 years ago
- ./nextcloud_data/:/var/www/html
4 years ago
entrypoint: /cron.sh
depends_on:
- nextcloud-db
- nextcloud-redis
networks:
default:
2 years ago
name: $DOCKER_MY_NETWORK
external: true
4 years ago
```
`.env`
```bash
# GENERAL
4 years ago
DOCKER_MY_NETWORK=caddy_net
4 years ago
TZ=Europe/Bratislava
4 years ago
# NEXTCLOUD-MARIADB
MYSQL_ROOT_PASSWORD=nextcloud
2 years ago
MARIADB_AUTO_UPGRADE=1
MARIADB_DISABLE_UPGRADE_BACKUP=1
4 years ago
MYSQL_PASSWORD=nextcloud
MYSQL_DATABASE=nextcloud
MYSQL_USER=nextcloud
2 years ago
# NEXTCLOUD-APP
4 years ago
MYSQL_HOST=nextcloud-db
REDIS_HOST=nextcloud-redis
2 years ago
OVERWRITEPROTOCOL=https
TRUSTED_PROXIES=caddy
NC_default_phone_region=SK # CHANGE TO YOUR COUNTRY CODE
4 years ago
2 years ago
# USING SENDINBLUE FOR SENDING EMAILS
2 years ago
MAIL_DOMAIN=nextcloud
4 years ago
MAIL_FROM_ADDRESS=nextcloud
2 years ago
SMTP_SECURE=tls
SMTP_HOST=smtp-relay.sendinblue.com
SMTP_PORT=587
SMTP_NAME=<registration-email@gmail.com>
SMTP_PASSWORD=<smtp-key-goes-here>
4 years ago
```
4 years ago
`nginx.conf`
4 years ago
```
2 years ago
Not be pasted here, too long.
It is included in this github repo.
4 years ago
```
4 years ago
2 years ago
[nginx.conf](https://raw.githubusercontent.com/DoTheEvo/selfhosted-apps-docker/master/nextcloud/nginx.conf)<br>
4 years ago
This is nginx web server configuration file, specifically setup
2 years ago
to support fastCGI PHP-FPM.<br>
From [this official nextcloud example
setup](https://github.com/nextcloud/docker/tree/master/.examples/docker-compose/insecure/mariadb/fpm/web)
4 years ago
and has one thing changed in it - the upstream hostname from `app` to `nextcloud-app`
4 years ago
```
upstream php-handler {
server nextcloud-app:9000;
}
```
---
4 years ago
**All containers must be on the same network**.</br>
4 years ago
Which is named in the `.env` file.</br>
4 years ago
If one does not exist yet: `docker network create caddy_net`
5 years ago
4 years ago
# Reverse proxy
5 years ago
4 years ago
[Nextcloud official documentation](https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/reverse_proxy_configuration.html)
4 years ago
regarding reverse proxy.
4 years ago
Caddy v2 is used, details
[here](https://github.com/DoTheEvo/selfhosted-apps-docker/tree/master/caddy_v2).</br>
4 years ago
There are few extra directives here to fix some nextcloud warnings.
`Caddyfile`
2 years ago
```php
4 years ago
nextcloud.{$MY_DOMAIN} {
header Strict-Transport-Security max-age=31536000;
redir /.well-known/carddav /remote.php/carddav 301
redir /.well-known/caldav /remote.php/caldav 301
2 years ago
redir /.well-known/webfinger /index.php/.well-known/webfinger 301
redir /.well-known/nodeinfo /index.php/.well-known/nodeinfo 301
reverse_proxy nextcloud-web:80
4 years ago
}
```
5 years ago
4 years ago
# First run
5 years ago
4 years ago
Nextcloud needs few moments to start, then there is the initial configuration,
creating admin account.</br>
2 years ago
If database env variables were not used then also the database info
would be required here.
5 years ago
4 years ago
![first-run-pic](https://i.imgur.com/lv1x9GF.png)
5 years ago
4 years ago
The domain or IP you access nextcloud on this first run is added
to `trusted_domains` in `config.php`.
4 years ago
Changing the domain later on will throw *"Access through untrusted domain"* error.</br>
2 years ago
Editing `nextcloud_data/config/config.php` and adding the new domain will fix it.
4 years ago
4 years ago
# Security & setup warnings
5 years ago
4 years ago
Nextcloud has a status check in *Settings > Administration > Overview*</br>
2 years ago
There could be some warnings there, but if following this guide, it should be
all good. As `Caddyfile` and `.env` file should take care of it.
5 years ago
2 years ago
[Here](https://github.com/DoTheEvo/selfhosted-apps-docker/tree/a86c8498dc8ebc59546660701a54b839bf417516/nextcloud#security--setup-warnings)
is a link to an older commit that talks in more detail on possible stuff here.<br>
But fuck writing on that noise when nextcloud is now doing phone number area
code notification there.
4 years ago
2 years ago
![status-pic](https://i.imgur.com/0nltwrn.png)
5 years ago
4 years ago
# Troubleshooting
2 years ago
* moving between docker hosts, might need to take ownership of directories<br>
exec in to `nextcloud-app`; `/var/www/html`; `chown www-data:www-data *`
5 years ago
4 years ago
# Extra info
5 years ago
4 years ago
#### check if redis container works
5 years ago
4 years ago
At `https://<nexcloud url>/ocs/v2.php/apps/serverinfo/api/v1/info`</br>
2 years ago
ctrl+f for `redis`, if it's present it means nexcloud is set to use it.
5 years ago
4 years ago
You can also exec in to redis container:
4 years ago
- `docker exec -it nextcloud-redis /bin/sh`
4 years ago
- start monitoring: `redis-cli MONITOR`
- start browsing files on the nextcloud
- there should be activity in the monitoring
#### check if cron container works
- after letting Nextcloud run for a while
- in *settings > administration > basic settings*</br>
- background jobs should be set to Cron</br>
- the last job info should never be older than 10 minutes</br>
5 years ago
4 years ago
# Update
5 years ago
4 years ago
Manual image update:
- `docker-compose pull`</br>
- `docker-compose up -d`</br>
- `docker image prune`
5 years ago
2 years ago
Updates tend to be problematic with Nexcloud. Inestigating what went wrong
in between major version updates... have backups before doing update.
And have the god damn tags on docker images.
4 years ago
# Backup and restore
5 years ago
4 years ago
#### Backup
2 years ago
Using [kopia](https://github.com/DoTheEvo/selfhosted-apps-docker/tree/master/kopia_backup)
or [borg](https://github.com/DoTheEvo/selfhosted-apps-docker/tree/master/borg_backup)
to make daily snapshot of the entire docker directory.
4 years ago
#### Restore
2 years ago
* down the containers `docker-compose down`</br>
* delete/move/rename the entire project directory</br>
* from the backups copy back the entire project directory</br>
4 years ago
* start the containers `docker-compose up -d`
5 years ago
4 years ago
# Backup of just user data
5 years ago
2 years ago
User's data daily export going by the
4 years ago
[official procedure.](https://docs.nextcloud.com/server/latest/admin_manual/maintenance/backup.html)</br>
For nextcloud it means entering the maintenance mode, doing a database dump
and backing up several directories containing data, configs, themes.</br>
5 years ago
2 years ago
Daily kopia/borg backup run takes care of backing up the directories.
So only database dump is needed and done with the script.</br>
5 years ago
4 years ago
#### Create a backup script
2 years ago
Placed inside `nextcloud` directory on the host.
4 years ago
`nextcloud-backup-script.sh`
```bash
#!/bin/bash
5 years ago
4 years ago
# MAINTENANCE MODE ON
4 years ago
docker container exec --user www-data --workdir /var/www/html nextcloud-app php occ maintenance:mode --on
5 years ago
4 years ago
# CREATE DATABASE DUMP, bash -c '...' IS USED OTHERWISE OUTPUT > WOULD TRY TO GO TO THE HOST
docker container exec nextcloud-db bash -c 'mysqldump --single-transaction -h nextcloud-db -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE > /var/lib/mysql/BACKUP.nextcloud.database.sql'
5 years ago
4 years ago
# MAINTENANCE MODE OFF
4 years ago
docker container exec --user www-data --workdir /var/www/html nextcloud-app php occ maintenance:mode --off
4 years ago
```
5 years ago
4 years ago
The script must be **executable** - `chmod +x nextcloud-backup-script.sh`
4 years ago
Test run the script `sudo ./nextcloud-backup-script.sh`</br>
4 years ago
The resulting database dump is in
2 years ago
`nextcloud/nextcloud_data_db/BACKUP.nextcloud.database.sql`
4 years ago
#### Cronjob
Running on the host, so that the script will be periodically run.
5 years ago
4 years ago
* `su` - switch to root
* `crontab -e` - add new cron job</br>
* `0 23 * * * /home/bastard/docker/nextcloud/nextcloud-backup-script.sh`</br>
runs it every day [at 23:00](https://crontab.guru/#0_23_*_*_*)
* `crontab -l` - list cronjobs to check
5 years ago
4 years ago
# Restore the user data
5 years ago
2 years ago
[The official docs.](https://docs.nextcloud.com/server/latest/admin_manual/maintenance/restore.html)
4 years ago
Assuming clean start.
4 years ago
* start the containers: `docker-compose up -d`</br>
4 years ago
let them run so they create the file structure
4 years ago
* down the containers: `docker-compose down`
4 years ago
* delete the directories `config`, `data`, `themes` in the freshly created
2 years ago
`nextcloud/nextcloud_data/`
2 years ago
* from the backup of `/nextcloud/nextcloud_data/`, copy the directories
`configs`, `data`, `themes` in to the new `/nextcloud/nextcloud_data/`
2 years ago
* from the backup of `/nextcloud/nextcloud_data_db/`, copy the backup database
named `BACKUP.nextcloud.database.sql` in to the new `/nextcloud/nextcloud_data_db/`
4 years ago
* start the containers: `docker-compose up -d`
* set the correct user ownership of the directories copied:</br>
4 years ago
`docker exec --workdir /var/www/html nextcloud-app chown -R www-data:www-data config data themes`
4 years ago
* restore the database</br>
`docker exec --workdir /var/lib/mysql nextcloud-db bash -c 'mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE < BACKUP.nextcloud.database.sql'`
* turn off the maintenance mode:</br>
4 years ago
`docker container exec --user www-data --workdir /var/www/html nextcloud-app php occ maintenance:mode --off`
4 years ago
* update the systems data-fingerprint:</br>
4 years ago
`docker exec --user www-data --workdir /var/www/html nextcloud-app php occ maintenance:data-fingerprint`
4 years ago
* restart the containers: `docker-compose restart`
* log in