From 27e2a258108905c71e94bbbf523b6280e1850864 Mon Sep 17 00:00:00 2001 From: David Young Date: Sat, 16 Dec 2017 22:13:55 +1300 Subject: [PATCH] Add NextCloud --- manuscript/images/nextcloud.png | Bin 0 -> 34383 bytes manuscript/recipies/nextcloud.md | 189 +++++++++++++++++++++++++++++++ mkdocs.yml | 1 + 3 files changed, 190 insertions(+) create mode 100644 manuscript/images/nextcloud.png create mode 100644 manuscript/recipies/nextcloud.md diff --git a/manuscript/images/nextcloud.png b/manuscript/images/nextcloud.png new file mode 100644 index 0000000000000000000000000000000000000000..63e733d2d49f022ddf91cc8d729cc8d32a0cf0fa GIT binary patch literal 34383 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 literal 0 HcmV?d00001 diff --git a/manuscript/recipies/nextcloud.md b/manuscript/recipies/nextcloud.md new file mode 100644 index 0000000..023150b --- /dev/null +++ b/manuscript/recipies/nextcloud.md @@ -0,0 +1,189 @@ +hero: Backup all your stuff. Share it. Privately. + +# NextCloud + +Nextcloud (_a [fork of OwnCloud](https://owncloud.org/blog/owncloud-statement-concerning-the-formation-of-nextcloud-by-frank-karlitschek/), led by original developer Frank Karlitschek_) is a suite of client-server software for creating and using file hosting services. It is functionally similar to Dropbox, although Nextcloud is free and open-source, allowing anyone to install and operate it on a private server. + - https://en.wikipedia.org/wiki/Nextcloud + +![NextCloud Screenshot](../images/nextcloud.png) + +This recipe is based on the official NextCloud docker image, but includes seprate containers ofor the database (_MariaDB_), Redis (_for transactional locking_), Apache Solr (_for full-text searching_), automated database backup, (_you *do* backup the stuff you care about, right?_) and a separate cron container for running NextCloud's 15-min crons. + +## Ingredients + +1. [Docker swarm cluster](/ha-docker-swarm/design/) with [persistent shared storage](/ha-docker-swarm/shared-storage-ceph.md) +2. [Traefik](/ha-docker-swarm/traefik) configured per design +3. DNS entry pointing your NextCloud url (_nextcloud.example.com_) to your [keepalived](ha-docker-swarm/keepalived/) IP + +## Preparation + +### Setup data locations + +We'll need several directories for [static data](/reference/data_layout/#static-data) to bind-mount into our container, so create them in /var/data/nextcloud (_so that they can be [backed up](/recipies/duplicity/)_) + +``` +mkdir /var/data/nextcloud +cd /var/data/nextcloud +mkdir -p {apps,config,data,database-dump} +``` + +Now make **more** directories for [runtime data](/reference/data_layout/#runtime-data) (_so that they can be **not** backed-up_): + +``` +mkdir /var/data/runtime/nextcloud +cd /var/data/runtime/nextcloud +mkdir -p {db,solr,redis} +``` + + +### Prepare environment + +Create nextcloud.env, and populate with the following variables +``` +NEXTCLOUD_ADMIN_USER=admin +NEXTCLOUD_ADMIN_PASSWORD=FVuojphozxMVyaYCUWomiP9b +MYSQL_HOST=db + +# For mysql +MYSQL_ROOT_PASSWORD= +MYSQL_DATABASE=nextcloud +MYSQL_USER=nextcloud +MYSQL_PASSWORD=set to something secure> + +# For database backup (keep 7 days daily backups) +MYSQL_PWD= +MYSQL_USER=root +BACKUP_NUM_KEEP=7 +BACKUP_FREQUENCY=1d +``` + +### Setup Docker Swarm + +Create a docker swarm config file in docker-compose syntax (v3), something like this: + +!!! tip + I share (_with my [patreon patrons](https://www.patreon.com/funkypenguin)_) a private "_premix_" git repository, which includes necessary docker-compose and env files for all published recipes. This means that patrons can launch any recipe with just a ```git pull``` and a ```docker stack deploy``` 👍 + + +``` +version: "3.0" + +services: + nextcloud: + image: nextcloud + env_file: /var/data/config/nextcloud/nextcloud.env + networks: + - internal + - traefik_public + deploy: + labels: + - traefik.frontend.rule=Host:nextcloud.example.com + - traefik.docker.network=traefik_public + - traefik.port=80 + volumes: + - /var/data/nextcloud/:/var/www/html + - /var/data/nextcloud/apps:/var/www/html/custom_apps + - /var/data/nextcloud/config:/var/www/html/config + - /var/data/nextcloud/data:/var/www/html/data + + db: + image: mariadb:10 + env_file: /var/data/config/nextcloud/nextcloud.env + networks: + - internal + volumes: + - /var/data/runtime/nextcloud/db:/var/lib/mysql + + db-backup: + image: mariadb:10 + env_file: /var/data/config/nextcloud/nextcloud.env + volumes: + - /var/data/nextcloud/database-dump:/dump + - /etc/localtime:/etc/localtime:ro + entrypoint: | + bash -c 'bash -s < /dump/dump_\`date +%d-%m-%Y"_"%H_%M_%S\`.sql.gz + (ls -t /dump/dump*.sql.gz|head -n $$BACKUP_NUM_KEEP;ls /dump/dump*.sql.gz)|sort|uniq -u|xargs rm -- {} + sleep $$BACKUP_FREQUENCY + done + EOF' + networks: + - internal + + redis: + image: redis:alpine + networks: + - internal + volumes: + - /var/data/runtime/nextcloud/redis:/data + + solr: + image: solr:6-alpine + networks: + - internal + volumes: + - /var/data/runtime/nextcloud/solr:/opt/solr/server/solr/mycores + entrypoint: + - docker-entrypoint.sh + - solr-precreate + - nextant + + cron: + image: nextcloud + volumes: + - /var/data/nextcloud/:/var/www/html + user: www-data + networks: + - internal + entrypoint: | + bash -c 'bash -s <``` + +Log into your new instance at https://**YOUR-FQDN**, with user "admin" and the password you specified in nextcloud.env. + +### Adding full-text search support (optional) + +Once logged in as an admin user, navigate to https:///index.php/settings/apps, and install the "**nextant**" app for full-text search + +Then navigate to https:///index.php/settings/admin/additional, scroll down to **Nextant (Full Text Search)**, and enter the following: + +* Address of your solr servlet : **http://solr:8983/solr/** +* Core: **nextant** + +## Chef's Notes + +1. Since many of my other recipies use PostgreSQL, I'd have preferred to use Postgres over MariaDB, but MariaDB seems to be the [preferred database type](https://github.com/nextcloud/server/issues/5912). + +## Your comments? diff --git a/mkdocs.yml b/mkdocs.yml index 33eeb2f..ab0f6d0 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -40,6 +40,7 @@ pages: - Miniflux: recipies/miniflux.md - Gollum: recipies/gollum.md - AutoPirate: recipies/autopirate.md + - NextCloud: recipies/nextcloud.md - Menu: - Ghost: recipies/ghost.md - GitLab: recipies/gitlab.md