Nextcloud

Nextcloud

NextCloud est un peu le Graal en matière d’auto hébergement. Bien plus qu’une solution de sync and share , il permet de gérer vos agendas, vos carnets d’adresses et bien plus encore…

Installation

Cette installation repose sur l’infra déployée précédemment et ne présente pas de problème particulier. Nextcloud propose aussi une alternative sans SGBD ( avec SQLite ) mais elle est déconseillée pour l’utilisation du client de synchronisation (voir doc)

2 variables d’environnements sont toutefois nécessaires:

  • TRUSTED_PROXIES=172.19.0.0/24 : correspond au subnet dédié à Traefik (voir doc)
1$ docker inspect traefik_lan | grep Subnet
2                    "Subnet": "172.19.0.0/24",
  • APACHE_DISABLE_REWRITE_IP=1: (not set by default): Set to 1 to disable rewrite ip.

J’utilise également le middleware chain de Traefik pour cumuler 2 autres middlewares:

  • headers
 1cat /opt/traefik/config/dynamic-conf/SecHeader.toml
 2[http]
 3  [http.middlewares]
 4    [http.middlewares.SecHeader]
 5      [http.middlewares.SecHeader.headers]
 6      frameDeny = true
 7      contentTypeNosniff = true
 8      browserXssFilter = true
 9      forceSTSHeader = true
10      sslRedirect = true
11      stsPreload =  true
12      stsSeconds = 15552000
13      stsIncludeSubdomains = true
14      customFrameOptionsValue = "SAMEORIGIN"
1cat /opt/traefik/config/dynamic-conf/nextcloud-redir.toml
2[http.middlewares]
3 [http.middlewares.nextcloud-redir.redirectRegex]
4   permanent = true
5   regex = "https://(.*)/.well-known/(card|cal)dav"
6   replacement = "https://${1}/remote.php/dav/"

Docker Compose

 1version: '3'
 2
 3services:
 4  app:
 5    image: nextcloud:20.0.2-apache
 6    container_name: nextcloud_app
 7    networks:
 8      - "traefik_lan"
 9      - "lan"
10    expose:
11      - "80"
12    volumes:
13      - app:/var/www/html
14    restart: unless-stopped
15    depends_on: db
16    environment:
17      - "TRUSTED_PROXIES=172.19.0.0/24"
18      - "APACHE_DISABLE_REWRITE_IP=1"
19      - "NEXTCLOUD_DATA_DIR=/var/www/html/data"
20      - "MYSQL_DATABASE=nextcloud"
21      - "MYSQL_USER=nextcloud"
22      - "MYSQL_PASSWORD=secured_password"
23      - "MYSQL_HOST=db"
24
25    labels:
26      - "traefik.enable=true"
27      - "traefik.docker.network=traefik_lan"
28      - "traefik.http.routers.nextcloudnotls.rule=Host(`drive.exemple.com`)"
29      - "traefik.http.routers.nextcloudnotls.entrypoints=webinsecure"
30      - "traefik.http.routers.nextcloudnotls.middlewares=tlsredir@file"
31      - "traefik.http.routers.nextcloud.rule=Host(`drive.exemple.com`)"
32      - "traefik.http.routers.nextcloud.entrypoints=websecure"
33      - "traefik.http.routers.nextcloud.tls=true"
34      - "traefik.http.routers.nextcloud.tls.certresolver=letsencrypt"
35      - "traefik.http.routers.nextcloud.middlewares=sh_nc"
36      - "traefik.http.middlewares.sh_nc.chain.middlewares=SecHeader@file,nextcloud-redir@file"
37
38  db:
39    image: mariadb:10.5.6
40    container_name: nextcloud_db
41    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
42    networks:
43      - "lan"
44    expose:
45      - "3306"
46    restart: unless-stopped
47    volumes:
48      - db:/var/lib/mysql
49    environment:
50      - MYSQL_ROOT_PASSWORD=secured-root-password
51      - MYSQL_PASSWORD=secured-password
52      - MYSQL_DATABASE=nextcloud
53      - MYSQL_USER=nextcloud
54
55networks:
56  traefik_lan:
57    external: true
58  lan:
59    ipam:
60      driver: default
61      config:
62        - subnet: "172.18.0.8/29"
63
64volumes:
65  app:
66  db:

après le traditionnel docker-compose up -d on obtient une instance NextCloud opérationnelle

screenshot NextCloud

OCC

occ (ownCloud Console) est une interface en ligne de commande pour administrer une instance Nextcloud. En environnement conteneurisé, il peut être pratique d’utiliser un alias:

1echo alias occ=\'docker exec -it -u www-data nextcloud_app php occ\' >> ~/.bashrc

Cela permet de lancer directement des opérations de maintenance comme l’ajout de clés primaires dans la base suite à une montée de version :

1$ occ db:add-missing-primary-keys
2Check primary keys.
3Adding primary key to the federated_reshares table, this can take some time...
4federated_reshares table updated successfully.
5Adding primary key to the systemtag_object_mapping table, this can take some time...
6systemtag_object_mapping table updated successfully.
7Adding primary key to the comments_read_markers table, this can take some time...
8comments_read_markers table updated successfully.