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.

283 lines
9.7 KiB
Markdown

4 years ago
# Nextcloud in docker
###### guide by example
4 years ago
![logo](https://i.imgur.com/VXSovC9.png)
4 years ago
4 years ago
# Purpose
4 years ago
4 years ago
File share & sync.
4 years ago
4 years ago
* [Official site](https://nextcloud.com/)
* [Github](https://github.com/nextcloud/server)
* [DockerHub](https://hub.docker.com/_/nextcloud/)
4 years ago
4 years ago
# Files and directory structure
4 years ago
```
/home
└── ~
└── docker
└── nextcloud
4 years ago
├── 🗁 nextcloud-data
4 years ago
├── 🗁 nextcloud-db-data
4 years ago
├── 🗋 .env
├── 🗋 docker-compose.yml
└── 🗋 nextcloud-backup-script.sh
4 years ago
```
4 years ago
# docker-compose
4 years ago
Official examples [here](https://github.com/nextcloud/docker/tree/master/.examples/docker-compose)
Four containers are spin up
4 years ago
- `nextcloud` - nextcloud app with apache web server with php as a module
4 years ago
- `nextcloud-db` - mariadb database where files-metadata and users-metadata are stored
- `nextcloud-redis` - in memory file caching and more reliable transactional file locking
- `nextcloud-cron` - for being able to run maintenance cronjobs
4 years ago
`docker-compose.yml`
```
version: '3'
services:
4 years ago
4 years ago
nextcloud-db:
image: mariadb
container_name: nextcloud-db
hostname: nextcloud-db
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
restart: unless-stopped
volumes:
4 years ago
- ./nextcloud-data-db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD
- MYSQL_PASSWORD
- MYSQL_DATABASE
- MYSQL_USER
4 years ago
4 years ago
nextcloud-redis:
image: redis:alpine
container_name: nextcloud-redis
hostname: nextcloud-redis
restart: unless-stopped
4 years ago
nextcloud:
image: nextcloud:apache
container_name: nextcloud
hostname: nextcloud
restart: unless-stopped
depends_on:
- nextcloud-db
- nextcloud-redis
volumes:
- ./nextcloud-data/:/var/www/html
4 years ago
environment:
- MYSQL_HOST
- REDIS_HOST
- MAIL_DOMAIN
- MAIL_FROM_ADDRESS
- SMTP_SECURE
- SMTP_HOST
- SMTP_PORT
- SMTP_NAME
- SMTP_PASSWORD
4 years ago
nextcloud-cron:
image: nextcloud:apache
container_name: nextcloud-cron
hostname: nextcloud-cron
restart: unless-stopped
4 years ago
volumes:
- ./nextcloud-data/:/var/www/html
4 years ago
entrypoint: /cron.sh
depends_on:
- nextcloud-db
- nextcloud-redis
networks:
default:
external:
name: $DEFAULT_NETWORK
```
4 years ago
`.env`
```
# GENERAL
MY_DOMAIN=blabla.org
DEFAULT_NETWORK=caddy_net
4 years ago
TZ=Europe/Prague
4 years ago
# NEXTCLOUD-MARIADB
MYSQL_ROOT_PASSWORD=nextcloud
MYSQL_PASSWORD=nextcloud
MYSQL_DATABASE=nextcloud
MYSQL_USER=nextcloud
4 years ago
# NEXTCLOUD
MYSQL_HOST=nextcloud-db
REDIS_HOST=nextcloud-redis
4 years ago
# USING SENDGRID FOR SENDING EMAILS
MAIL_DOMAIN=blabla.org
MAIL_FROM_ADDRESS=nextcloud
SMTP_SECURE=ssl
SMTP_HOST=smtp.sendgrid.net
SMTP_PORT=465
SMTP_NAME=apikey
SMTP_PASSWORD=SG.asdasdasdasdasdasdsaasdasdsa
4 years ago
```
4 years ago
**All containers must be on the same network**.</br>
If one does not exist yet: `docker network create caddy_net`
4 years ago
4 years ago
# Reverse proxy
4 years ago
4 years ago
[Nextcloud official documentation](https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/reverse_proxy_configuration.html)
regarding reverse proxy.
4 years ago
Caddy v2 is used,
4 years ago
details [here](https://github.com/DoTheEvo/Caddy-v2-docker-example-setup)
4 years ago
4 years ago
There are few extra directives here to fix some nextcloud warnings
4 years ago
`Caddyfile`
```
{
# acme_ca https://acme-staging-v02.api.letsencrypt.org/directory
}
nextcloud.{$MY_DOMAIN} {
4 years ago
reverse_proxy nextcloud:80
header Strict-Transport-Security max-age=31536000;
redir /.well-known/carddav /remote.php/carddav 301
redir /.well-known/caldav /remote.php/caldav 301
4 years ago
}
```
4 years ago
# First run
4 years ago
4 years ago
Nextcloud needs few minutes to start, then there is the initial configuration.
4 years ago
Creating admin account and giving the database details as set in the `.env` file
4 years ago
4 years ago
![first-run-pic](https://i.imgur.com/EygHgKa.png)
4 years ago
4 years ago
The domain or IP you access nextcloud on this first run is added
to `trusted_domains` in `config.php`.
Changing the domain later on will throw *"Access through untrusted domain"* error.
Editing config.php and adding the new domain will fix it.
4 years ago
# Security & setup warnings
4 years ago
4 years ago
Nextcloud has status check in *Settings > Administration > Overview*</br>
There are likely several warnings on a freshly spun container.
4 years ago
4 years ago
- **The database is missing some indexes**
- `docker exec --user www-data --workdir /var/www/html nextcloud php occ db:add-missing-indices`
4 years ago
4 years ago
- **Some columns in the database are missing a conversion to big int**
- `docker exec --user www-data --workdir /var/www/html nextcloud php occ db:convert-filecache-bigint`
4 years ago
4 years ago
- **The "Strict-Transport-Security" HTTP header is not set to at least "15552000" seconds.**
- helps to know what [HSTS means](https://www.youtube.com/watch?v=kYhMnw4aJTw)
- fixed in the reverse proxy section above in caddy config
- the line `header Strict-Transport-Security max-age=31536000;`
4 years ago
4 years ago
- **Your web server is not properly set up to resolve "/.well-known/caldav"** and **Your web server is not properly set up to resolve "/.well-known/carddav".**
- fixed in the reverse proxy section above in caddy config
- `redir /.well-known/carddav /remote.php/carddav 301`
- `redir /.well-known/caldav /remote.php/caldav 301`
4 years ago
4 years ago
![status-pic](https://i.imgur.com/wjjd5CJ.png)
4 years ago
4 years ago
4 years ago
# Extra info
4 years ago
4 years ago
- **check if redis container works**</br>
at `https://<nexcloud url>/ocs/v2.php/apps/serverinfo/api/v1/info`</br>
ctrl+f for `redis`, should be in memcache.distributed and memcache.locking
4 years ago
4 years ago
you can also exec in to redis container: `docker exec -it nextcloud-redis /bin/bash`</br>
start monitoring: `redis-cli MONITOR`</br>
start browsing files on the nextcloud,
there should be activity in the monitoring
4 years ago
4 years ago
- **check if cron container works**</br>
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>
4 years ago
# Update
4 years ago
4 years ago
* [watchtower](https://github.com/DoTheEvo/selfhosted-apps-docker/tree/master/watchtower) updates the image automatically
4 years ago
* manual image update</br>
`docker-compose pull`</br>
`docker-compose up -d`</br>
`docker image prune`
4 years ago
# Backup and restore
4 years ago
* **backup** using [borgbackup setup](https://github.com/DoTheEvo/selfhosted-apps-docker/tree/master/borg_backup)
that makes daily snapshot of the entire directory
* **restore**</br>
down the nextcloud containers `docker-compose down`</br>
delete the entire nextcloud directory</br>
4 years ago
from the backup copy back the nextcloud directory</br>
4 years ago
start the container `docker-compose up -d`
4 years ago
# Backup of just user data
4 years ago
user-data daily export using the [official procedure.](https://docs.nextcloud.com/server/latest/admin_manual/maintenance/backup.html)</br>
For nextcloud it means entering maintenance mode,
database dump and backing up several directories containing data, configs, themes.</br>
4 years ago
For the script it just means database dump as borg backup and its deduplication
will deal with the directories, especially in the case of nextcloud where
hundreds gigabytes can be stored.
4 years ago
* **create a backup script**</br>
placed inside `nextcloud` directory on the host
`nextcloud-backup-script.sh`
```
#!/bin/bash
# MAINTENANCE MODE ON
docker container exec --user www-data --workdir /var/www/html nextcloud php occ maintenance:mode --on
# 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'
# MAINTENANCE MODE OFF
docker container exec --user www-data --workdir /var/www/html nextcloud php occ maintenance:mode --off
```
4 years ago
the script must be **executable** - `chmod +x nextcloud-backup-script.sh`
4 years ago
* **cronjob** on the host</br>
`crontab -e` - add new cron job</br>
4 years ago
`0 2 * * * /home/bastard/docker/nextcloud/nextcloud-backup-script.sh` - run it [at 02:00](https://crontab.guru/#0_2_*_*_*)</br>
4 years ago
`crontab -l` - list cronjobs
4 years ago
# Restore the user data
4 years ago
Assuming clean start, first restore the database before running the app container.
* start the containers: `docker-compose up -d`</br>
let it run so it creates its file structure
* down the containers: `docker-compose up -d`
4 years ago
* from backup copy the directories `data`, `configs`, `themes` in to `nextcloud-data` replacing the ones in place
4 years ago
* from backup copy the backup database in to `nextcloud-db-data`
4 years ago
* start the containers: `docker-compose up -d`
4 years ago
* set the correct user ownership of the directories copied:</br>
4 years ago
`docker exec --workdir /var/www/html nextcloud chown -R www-data:www-data config data themes`
* 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>
`docker container exec --user www-data --workdir /var/www/html nextcloud php occ maintenance:mode --off`
* update the systems data-fingerprint:</br>
`docker exec --user www-data --workdir /var/www/html nextcloud php occ maintenance:data-fingerprint`
* restart the containers: `docker-compose restart`
* log in