diff --git a/pica-grafana/README.md b/pica-grafana/README.md new file mode 100644 index 0000000000000000000000000000000000000000..a1553e92bca41ccc8f4d5c8fa7e40777774aea9f --- /dev/null +++ b/pica-grafana/README.md @@ -0,0 +1,42 @@ +## Grafana + +Ce dossier contient les ressources nécessaires pour lancer une instance Grafana, qui nous sert à visualiser les métriques des services (via [pica-metrics-bot](../pica-metrics-bot)) et Prometheus. + +Notez que Rhizome a aussi un compte créé manuellement sur l'instance : il faudra faire attention à les prévenir en cas de mise à jour ou de déplacement de l'instance. + +Attention : même si l'authentification LDAP est activée, elle semble ne pas fonctionner : la connexion ne fonctionne que grâce à l'utilisateur administrateur. Voir [cette page](https://grafana.com/docs/grafana/latest/auth/ldap/#ldap-debug-view) pour investiguer et régler le problème. + +### Configuration + +#### Emplacements + +La configuration est réalisée : + +* Par les variables d'environnement de [Compose](./docker-compose.yml), qui permettent d'accéder à tous les paramètres de la configuration (voir la [documentation](https://grafana.com/docs/grafana/latest/administration/configuration/#configure-with-environment-variables)) : cette méthode est utilisée pour tous les paramètres non-critiques. +* Par le fichier [ldap.toml](./ldap.toml) pour la configuration spécifique au LDAP. Ce fichier peut faire référence à des variables d'environnement avec [cette syntaxe](https://grafana.com/docs/grafana/latest/auth/ldap/#using-environment-variables), pour les données critiques (*e.g.* mot de passe) +* Par le fichier [grafana.secrets](./secrets/grafana.secrets.example), pour les secrets. + +#### Utilisateurs + +Il y a trois types d'utilisateurs : + +* L'administrateur de l'instance, configuré via l'environnement (Compose et secret) +* Les utilisateurs LDAP +* Les utilisateurs créés manuellement, comme Rhizome + +### Lancement + +Copier `grafana.secrets.example` dans `grafana.secrets` et remplacer les valeurs. +Lancer : + +```bash +docker-compose up -d +``` + +### Mise à jour + +Il suffit de mettre à jour le tag dans Compose. Pour le moment, nous utilisons une image de notre registre privé, mais il probable qu'il soit plus pertinent d'utiliser les images officielles (`grafana/grafana`). + +Cette possibilité devra être étudiée à la prochaine mise à jour. + +Il ne devrait pas y avoir de manipulation spécifiques pour mettre à jour une instance Docker : voir [la documentation](https://grafana.com/docs/grafana/latest/installation/upgrading/#docker) pour le vérifier. diff --git a/pica-grafana/docker-compose.yml b/pica-grafana/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..4a94ff55c9b4655193184ec01dba5a56a6b29614 --- /dev/null +++ b/pica-grafana/docker-compose.yml @@ -0,0 +1,26 @@ +version: '3.7' + +volumes: + grafana: + name: grafana + +services: + grafana: + image: registry.picasoft.net/grafana:6.4.4 + container_name: grafana + volumes: + - grafana:/var/lib/grafana + - ./ldap.toml:/etc/grafana-ldap/ldap.toml + environment: + - GF_DEFAULT_INSTANCE_NAME=picasoft + - GF_SERVER_ROOT_URL=https://grafana.picasoft.net + - GF_SECURITY_ADMIN_USER=picasoft + - GF_AUTH_LDAP_ENABLED=true + - GF_AUTH_LDAP_CONFIG_FILE=/etc/grafana-ldap/ldap.toml + - GF_AUTH_LDAP_ALLOW_SIGN_UP=false + env_file: ./secrets/grafana.secrets + labels: + - "traefik.frontend.rule=Host:grafana.picasoft.net" + - "traefik.port=3000" + - "traefik.enable=true" + restart: always diff --git a/pica-grafana/ldap.toml b/pica-grafana/ldap.toml new file mode 100644 index 0000000000000000000000000000000000000000..0c053a2f2642fbdcf30334807a765dbd2821defb --- /dev/null +++ b/pica-grafana/ldap.toml @@ -0,0 +1,65 @@ +# To troubleshoot and get more log info enable ldap debug logging in grafana.ini +# [log] +# filters = ldap:debug + +[[servers]] +# Ldap server host (specify multiple hosts space separated) +host = "ldap.picasoft.net" +# Default port is 389 or 636 if use_ssl = true +port = 389 +# Set to true if ldap server supports TLS +use_ssl = false +# Set to true if connect ldap server with STARTTLS pattern (create connection in insecure, then upgrade to secure connection with TLS) +start_tls = false +# set to true if you want to skip ssl cert validation +ssl_skip_verify = true # Le LDAP est accessible que depuis les VM Picasoft, il me semble qu'il n'y a pas de ssl configuré +# set to the path to your root CA certificate or leave unset to use system defaults +# root_ca_cert = "/path/to/certificate.crt" +# Authentication against LDAP servers requiring client certificates +# client_cert = "/path/to/client.crt" +# client_key = "/path/to/client.key" + +# Search user bind dn +bind_dn = "cn=grafana,ou=Services,dc=picasoft,dc=net" +# Search user bind password +# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;""" +bind_password = '${LDAP_GRAFANA_PASSWORD}' + +# User search filter, for example "(cn=%s)" or "(sAMAccountName=%s)" or "(uid=%s)" +search_filter = "(&(objectClass=posixAccount)(uid=%s))" + +# An array of base dns to search through +search_base_dns = ["ou=People,dc=picasoft,dc=net"] + +## For Posix or LDAP setups that does not support member_of attribute you can define the below settings +## Please check grafana LDAP docs for examples +group_search_filter = "(&(objectClass=posixGroup)(memberUid=%s))" +group_search_base_dns = ["ou=Groups,dc=picasoft,dc=net"] +group_search_filter_user_attribute = "uid" # J'ai laissé la valeur par défaut, aucune idée si ça va marcher +#group_search_filter_user_attribute = "cn" # J'ai laissé la valeur par défaut, aucune idée si ça va marcher + +# Specify names of the ldap attributes your ldap uses +[servers.attributes] +name = "givenName" +surname = "sn" +username = "cn" +#member_of = "memberOf" # Celui là on ne l'utilise pas +email = "mail" + +# Map ldap groups to grafana org roles +[[servers.group_mappings]] +group_dn = "cn=admin,ou=Groups,dc=picasoft,dc=net" +org_role = "Admin" +# To make user an instance admin (Grafana Admin) uncomment line below +# grafana_admin = true +# The Grafana organization database id, optional, if left out the default org (id 1) will be used +# org_id = 1 + +[[servers.group_mappings]] +group_dn = "cn=tech,ou=Groups,dc=picasoft,dc=net" +org_role = "Editor" + +[[servers.group_mappings]] +# If you want to match all (or no ldap groups) then you can use wildcard +group_dn = "*" +org_role = "Viewer" diff --git a/pica-grafana/secrets/grafana.secrets.example b/pica-grafana/secrets/grafana.secrets.example new file mode 100644 index 0000000000000000000000000000000000000000..afae639fd50cce45efb6a8aa33f28d97972663ad --- /dev/null +++ b/pica-grafana/secrets/grafana.secrets.example @@ -0,0 +1,2 @@ +GF_SECURITY_ADMIN_PASSWORD=password +LDAP_GRAFANA_PASSWORD=ldap_password