Comment superviser Nextcloud avec Grafana ?

 

Chez Aukfood, nous utilisons deux outils pour superviser nos infrastructures : Centreon (pour le côté alerting), et Grafana (pour avoir tout un tas de données à un instant T). Ce sont deux outils très intéressants, et avec lesquels on peut aller très loin dans le processus de supervision.
C'est pour cela que nous avons réussi à superviser une instance Nextcloud de façon plus poussée, avec Grafana, avec un système de métriques.

1. Le concept

Nous avons mis en place un exporteur de métriques, dont le projet (bien sûr open-source) est disponible sur GitHub (https://github.com/xperimental/nextcloud-exporter). On va le connecter à l'API de Nextcloud, et l'exporteur va remonter des informations de façon périodique, grâce à Prometheus, qui seront ensuite exploitées par Grafana.

Les valeurs remontées par l'exporteur sont les suivantes, et on ne peut qu'espérer qu'elles seront plus nombreuses au fur et à mesure des mises à jour :

name description
nextcloud_active_users_daily_total Number of active users in the last 24 hours
nextcloud_active_users_hourly_total Number of active users in the last hour
nextcloud_active_users_total Number of active users for the last five minutes
nextcloud_apps_installed_total Number of currently installed apps
nextcloud_apps_updates_available_total Number of apps that have available updates
nextcloud_database_info Contains meta information about the database as labels. Value is always 1.
nextcloud_database_size_bytes Size of database in bytes as reported from engine
nextcloud_exporter_info Contains meta information of the exporter. Value is always 1.
nextcloud_files_total Number of files served by the instance
nextcloud_free_space_bytes Free disk space in data directory in bytes
nextcloud_php_info Contains meta information about PHP as labels. Value is always 1.
nextcloud_php_memory_limit_bytes Configured PHP memory limit in bytes
nextcloud_php_upload_max_size_bytes Configured maximum upload size in bytes
nextcloud_scrape_errors_total Counts the number of scrape errors by this collector
nextcloud_shares_federated_total Number of federated shares by direction sent / received
nextcloud_shares_total Number of shares by type: authlink: shared password protected links group: shared groups link: all shared links user: shared users mail: shared by mail room: shared with room
nextcloud_system_info Contains meta information about Nextcloud as labels. Value is always 1.
nextcloud_up Indicates if the metrics could be scraped by the exporter: 1: successful 0: unsuccessful (server down, server/endpoint not reachable, invalid credentials, ...)
nextcloud_users_total Number of users of the instance

2. Installation de Nextcloud Exporter

Supposons que vous avez déjà une architecture Nextcloud, et Grafana (avec Prometheus installé) opérationnelle. Nous allons installer l'exporteur en conteneur Docker.

Vous pouvez l'installer sur n'importe quelle machine, le seul prérequis est qu'il faut qu'elle puisse effectuer des requêtes sur le serveur Nextcloud, et qu'elle puisse être atteinte par Prometheus.

Créons un répertoire nextcloud-exporter :

mkdir nextcloud-exporter

Puis utilisons le docker-compose.yml suivant :

---
version: "3.3"
services:
  nextcloud-exporter:
    container_name: nextcloud-exporter
    image: "xperimental/nextcloud-exporter"
    security_opt:
      - no-new-privileges:true
    command: nextcloud-exporter -c /conf/config.yml 
    ports:
      - 127.0.0.1:9205:9205
    cap_add:
      - MKNOD
    volumes:
      - /var/nextcloud-exporter/nextcloud_exporter_conf:/conf:ro
    restart: always

volumes:
  nextcloud_exporter_conf:
    driver: local

Notons également que le conteneur sera exposé en local sur le port 9205. Nous configurerons un Vhost Apache pour qu'il soit accessible (à travers une restriction IP et un .htpasswd) depuis le serveur de supervision.

À l'intérieur de ce répertoire, créer nextcloud_exporter_conf, qui abritera le fichier de configuration config.yml :

# required
server: "https://URL_NEXTCLOUD"
# required for token authentication
authToken: "A_Generer"
# optional
listenAddress: ":9205"
timeout: "5s"
tlsSkipVerify: false

Il faudra également générer un token pour la valeur de authToken. Ceci se fait depuis Nextcloud.

Lorsque tout est fait, lançons le conteneur :

docker-compose up -d

Le conteneur est opérationnel, libre à vous de faire la configuration du proxy.

3. Configuration de Prometheus

Pour la suite de l'article, nous allons paramétrer la partie Prometheus. Le fichier de configuration est le suivant : /etc/prometheus/prometheus.yml.

Ajoutons le job suivant (attention à l'intendation qui est indispensable 😉) :

- job_name: 'nextcloud-test'
  metrics_path: '/'
  scrape_interval: 5s
  scheme: https
  basic_auth:
    username: "usernameDefini"
    password: "passwordHtAccess"
  static_configs:
  - targets: 
    - 'URL_Nextcloud_Exporter'

Puis redémarrons Prometheus :

systemctl restart prometheus

4. Configuration du dashboard Grafana

Maintenant, libre à vous d'ajouter les panels de votre choix, suivant les valeurs remontées par l'exporter, et définis en introduction.

Ci-joint un exemple de dashboard :

N'hésitez pas à nous consulter pour toute expertise sur Nextcloud, Grafana/Prometheus, ou l'interconnexion entre les deux !