From 9de8160d21ad18bcb08305f1638f20b341dc5820 Mon Sep 17 00:00:00 2001
From: Quentin Duchemin <quentinduchemin@tuta.io>
Date: Mon, 1 Jun 2020 22:28:50 +0200
Subject: [PATCH] [PicaMetrics] Build with CI, manage conf and secrets with Git

---
 pica-metrics-bot/CHANGELOG.md                 | 10 +++++
 pica-metrics-bot/Dockerfile                   | 19 ++++++++
 pica-metrics-bot/README.md                    | 21 +++++++++
 pica-metrics-bot/clair-whitelist.yml          |  1 +
 pica-metrics-bot/config.json                  | 28 ++++++++++++
 pica-metrics-bot/docker-compose.yml           | 43 +++++++++++++++++++
 pica-metrics-bot/entrypoint.sh                | 36 ++++++++++++++++
 pica-metrics-bot/picasoft-metrics-bot         |  2 +-
 .../secrets/account.secrets.example           |  4 ++
 .../secrets/influxdb.secrets.example          |  7 +++
 10 files changed, 170 insertions(+), 1 deletion(-)
 create mode 100644 pica-metrics-bot/CHANGELOG.md
 create mode 100644 pica-metrics-bot/Dockerfile
 create mode 100644 pica-metrics-bot/README.md
 create mode 100644 pica-metrics-bot/clair-whitelist.yml
 create mode 100644 pica-metrics-bot/config.json
 create mode 100644 pica-metrics-bot/docker-compose.yml
 create mode 100644 pica-metrics-bot/entrypoint.sh
 create mode 100644 pica-metrics-bot/secrets/account.secrets.example
 create mode 100644 pica-metrics-bot/secrets/influxdb.secrets.example

diff --git a/pica-metrics-bot/CHANGELOG.md b/pica-metrics-bot/CHANGELOG.md
new file mode 100644
index 00000000..c32470f3
--- /dev/null
+++ b/pica-metrics-bot/CHANGELOG.md
@@ -0,0 +1,10 @@
+# Version 1.0.1
+
+* Mise à jour avec le code permettant de récupérer le nombre d'utilisateurs actifs.
+* Injection des secrets via un entrypoint personnalisé.
+* Passage d'InfluxDB en volume Docker.
+* Isolation réseau du bot (pas besoin d'être contacté de l'extérieur)
+
+# Version 1.0.0
+
+Version initiale.
diff --git a/pica-metrics-bot/Dockerfile b/pica-metrics-bot/Dockerfile
new file mode 100644
index 00000000..9ab271e2
--- /dev/null
+++ b/pica-metrics-bot/Dockerfile
@@ -0,0 +1,19 @@
+FROM python:3.8-alpine
+
+LABEL maintainer quentinduchemin@tuta.io
+
+# Copy all code
+COPY picasoft-metrics-bot /code
+
+# Custom Picasoft entrypoint
+COPY entrypoint.sh /entrypoint.sh
+RUN chmod +x /entrypoint.sh
+
+WORKDIR /code
+
+# Install dependencies
+RUN pip3 install -r requirements.txt
+
+VOLUME /code/config/config.json
+
+ENTRYPOINT [ "/entrypoint.sh" ]
diff --git a/pica-metrics-bot/README.md b/pica-metrics-bot/README.md
new file mode 100644
index 00000000..b17626f5
--- /dev/null
+++ b/pica-metrics-bot/README.md
@@ -0,0 +1,21 @@
+# Métriques des services Picasoft
+
+Dans ce dossier se trouvent les éléments de configuration permettant de faire fonctionner [Picasoft Metrics Bot](https://gitlab.utc.fr/picasoft/projets/picasoft-metrics-bot).
+
+C'est un projet indépendant ajouté en submodule dans le dossier [picasoft-metrics-bot](./picasoft-metrics-bot), car il est léger et car cela facilite la construction du Dockerfile.
+
+Par rapport au projet original :
+* La configuration en production est versionnée ici, et un Docker Compose adapté est proposé
+* Un [entrypoint](./entrypoint.sh) modifié permet d'injecter des secrets sous forme de variables d'environnement
+* La construction de l'image est gérée par la chaîne d'intégration et permet d'analyser la sécurité de l'image
+* Ajout d'InfluxDB directement adossé à Picasoft Metrics Bot, dans un seul Docker Compose!
+
+## Premier lancement
+
+Copier les fichiers `.secrets.example` en `.secrets` et remplacez les valeurs.
+
+L'utilisateur InfluxDB qui doit être utilisé dans Picasoft Metrics Bot est celui avec les droits d'écriture (mais pas d'administrateur). Dans le fichier d'exemple, c'est `picasoft-write`.
+
+## Mise à jour
+
+Le projet Picasoft Metrics Bot n'a pas de numéro de version : pour reconstruire l'image avec les dernières modifications, il suffira de changer le tag dans le fichier Docker Compose et de lancer manuellement la construction au niveau du Pipeline du commit.
diff --git a/pica-metrics-bot/clair-whitelist.yml b/pica-metrics-bot/clair-whitelist.yml
new file mode 100644
index 00000000..a9d6ed5b
--- /dev/null
+++ b/pica-metrics-bot/clair-whitelist.yml
@@ -0,0 +1 @@
+generalwhitelist:
diff --git a/pica-metrics-bot/config.json b/pica-metrics-bot/config.json
new file mode 100644
index 00000000..ee2dffcc
--- /dev/null
+++ b/pica-metrics-bot/config.json
@@ -0,0 +1,28 @@
+{
+  "influxdb": {
+    "url": "https://influxdb.picasoft.net",
+    "user": "INFLUXDB_USER",
+    "password": "INFLUXDB_PASSWORD",
+    "database": "picasoft"
+  },
+  "modules" : {
+    "etherpad" : [
+      {
+        "url" : "https://pad.picasoft.net",
+        "name" : "pad.picasoft.net"
+      },
+      {
+        "url" : "https://week.pad.picasoft.net",
+        "name" : "week.pad.picasoft.net"
+      }
+    ],
+    "mattermost" : [
+      {
+        "url" : "https://team.picasoft.net",
+        "user" : "MATTERMOST_USER",
+        "password" : "MATTERMOST_PASSWORD",
+        "name" : "team.picasoft.net"
+      }
+    ]
+  }
+}
diff --git a/pica-metrics-bot/docker-compose.yml b/pica-metrics-bot/docker-compose.yml
new file mode 100644
index 00000000..39b01b19
--- /dev/null
+++ b/pica-metrics-bot/docker-compose.yml
@@ -0,0 +1,43 @@
+version: 3.7
+
+volumes:
+  influxdb:
+    name: influxdb
+
+networks:
+  docker_default:
+    external: true
+  picasoft-metrics:
+
+services:
+  picasoft-metrics-bot:
+    image: registry.picasoft.net/picasoft-metrics-bot:v1.0.1
+    container_name: picasoft-metrics-bot
+    volumes:
+      - config.json:/code/config/config.json
+    environment:
+      - INTERVAL_SECONDS=60
+    env_file: ./secrets/account.secrets
+    networks:
+      - picasoft-metrics
+    restart: unless-stopped
+
+influxdb:
+    image: registry.picasoft.net/influxdb:1.7.9
+    container_name: influxdb
+    volumes:
+      - influxdb:/var/lib/influxdb
+    environment:
+      - INFLUXDB_HTTP_AUTH_ENABLED=true
+      - INFLUXDB_DATA_MAX_VALUES_PER_TAG=0
+      # See https://docs.influxdata.com/influxdb/v1.7/administration/upgrading/#switch-between-tsm-and-tsi-indexes
+      - INFLUXDB_DATA_INDEX_VERSION=tsi1
+    env_file: ./secrets/influxdb.secrets
+    labels:
+      traefik.frontend.rule: "Host:influxdb.picasoft.net"
+      traefik.port: 8086
+      traefik.enable: true
+    networks:
+      - picasoft-metrics
+      - docker_default
+    restart: always
diff --git a/pica-metrics-bot/entrypoint.sh b/pica-metrics-bot/entrypoint.sh
new file mode 100644
index 00000000..7b300b66
--- /dev/null
+++ b/pica-metrics-bot/entrypoint.sh
@@ -0,0 +1,36 @@
+#/usr/bin/env sh
+
+set -e
+
+if [ -z "${INFLUXDB_USER}" ]; then
+	echo >&2 'Error : missing required ${INFLUXDB_USER} environment variable, exiting.'
+	exit 1
+fi
+
+if [ -z "${INFLUXDB_PASSWORD}" ]; then
+	echo >&2 'Error : missing required ${INFLUXDB_PASSWORD} environment variable, exiting.'
+	exit 1
+fi
+
+if [ -z "${MATTERMOST_USER}" ]; then
+	echo >&2 'Error : missing required ${MATTERMOST_USER} environment variable, exiting.'
+	exit 1
+fi
+
+if [ -z "${MATTERMOST_PASSWORD}" ]; then
+	echo >&2 'Error : missing required ${MATTERMOST_PASSWORD} environment variable, exiting.'
+	exit 1
+fi
+
+sed -i s|INFLUXDB_USER|${INFLUXDB_USER}|g /code/config/config.json
+sed -i s|INFLUXDB_PASSWORD|${INFLUXDB_PASSWORD}|g /code/config/config.json
+sed -i s|MATTERMOST_USER|${MATTERMOST_USER}|g /code/config/config.json
+sed -i s|MATTERMOST_PASSWORD|${MATTERMOST_PASSWORD}|g /code/config/config.json
+
+INTERVAL_SECONDS=${INTERVAL_SECONDS:-60}
+
+while :
+do
+  python3 main.py
+  sleep $INTERVAL_SECONDS
+done
diff --git a/pica-metrics-bot/picasoft-metrics-bot b/pica-metrics-bot/picasoft-metrics-bot
index fdf56de4..416a6397 160000
--- a/pica-metrics-bot/picasoft-metrics-bot
+++ b/pica-metrics-bot/picasoft-metrics-bot
@@ -1 +1 @@
-Subproject commit fdf56de4a01f995e0d8e63b85148d7491f7b47df
+Subproject commit 416a6397f5963c4021f380af97b7bbff1fb71239
diff --git a/pica-metrics-bot/secrets/account.secrets.example b/pica-metrics-bot/secrets/account.secrets.example
new file mode 100644
index 00000000..53dcaef1
--- /dev/null
+++ b/pica-metrics-bot/secrets/account.secrets.example
@@ -0,0 +1,4 @@
+INFLUXDB_USER=user
+INFLUXDB_PASSWORD=password
+MATTERMOST_USER=user
+MATTERMOST_PASSWORD=password
diff --git a/pica-metrics-bot/secrets/influxdb.secrets.example b/pica-metrics-bot/secrets/influxdb.secrets.example
new file mode 100644
index 00000000..0335b358
--- /dev/null
+++ b/pica-metrics-bot/secrets/influxdb.secrets.example
@@ -0,0 +1,7 @@
+INFLUXDB_DB=picasoft
+INFLUXDB_ADMIN_USER=picasoft-admin
+INFLUXDB_ADMIN_PASSWORD=password
+INFLUXDB_WRITE_USER=picasoft-write
+INFLUXDB_WRITE_USER_PASSWORD=password
+INFLUXDB_READ_USER=picasoft-read
+INFLUXDB_READ_USER_PASSWORD=password
-- 
GitLab