SWS The Shifters 3 colors.png
Le Site Web des Shifters est désormais en ligne.
Retrouvez le sur www.theshifters.org

Plateforme pédagogique

De The Shifters Wiki
Révision datée du 6 septembre 2019 à 10:31 par imported>Vayel (→‎Contenu de la mission)
Sauter à la navigation Sauter à la recherche


Mission
Dates
Créée Achevée
21/06/2019
Contacts
The Shift Project Shifters
Clémence V. Vincent Lefoulon
Contributeurs
27
Documents
Cahier des charges

Description de la mission

Structurer une communauté d’enseignants, via un espace de travail (Slack ou autre, à réfléchir) permettant à ces personnes d’échanger entre elles au sujet de l'enseignement des enjeux climatiques.

Les besoins sont décrits dans le cahier des charges.

A ce propos, « il s’agit là d’un projet très élaboré et ambitieux, qui nécessite de lourds moyens (évalués par un professionnel à 70000€ d’expertise), et dont nous souhaiterions voir le Ministère s’emparer. Ce que nous visons dans le cadre de cette mission est d’une ampleur moindre, et vise surtout à offrir une solution alternative aux enseignants et autres acteurs de la communauté pédagogique qui souhaite échanger avec leurs pairs de différentes disciplines, et partager des ressources pédagogiques. Et ce en attendant que la plateforme que nous avons pensée voit le jour (ce qui risque de prendre du temps, si cela a lieu) ».

Le mail de Clémence contient des informations supplémentaires :

Certains d’entre vous ont demandé certaines précisions avant de confirmer leur engagement, je vais donc tacher d’éclairer la démarche, afin que vous puissiez décider si vous souhaitez vraiment contribuer à cette mission :

  • Il s’agit à ce stade uniquement de constituer et structurer la plateforme, pas encore de la diffuser, ni encore de l’alimenter avec des ressources et témoignages. Cette phase viendra plus tard. Si c’est sur cet aspect que vous souhaitez contribuer, ne vous inquiétez pas, tout le réseau des Shifters seront tenus informés de la mise en route de la plateforme, et il sera temps d’apporter votre aide pour cette étape à ce stade.
  • En ce qui concerne l’organisation de cette mission, il est nécessaire qu’un pilote se désigne, pour coordonner le travail, et animer le suivi de la mission, et faire le lien plus directement avec moi au Shift. à certains d’entre vous se sentent-ils capables de tenir ce rôle ? En effet, je ne piloterais pas précisément cette mission, même si nous travaillerons en étroite collaboration pour être sûrs d’aller dans la bonne (et la même) direction. Si vous êtes intéressés, merci de me le signaler !
  • En ce qui concerne les outils de travail, le plus simple est que ceux d’entre vous qui sont toujours motivés pour discuter concrètement des outils et supports à disposition se retrouve sur une chaine dédiée sur le slack Shifters (#Mission Plateforme pédagogique) pour se reconnaitre et initier les échanges. Pour le support « papier », je vous laisse décider de l’outil qui vous convient le mieux (j’ai personnellement tendance à utiliser un googledoc et googlesheet pour travailler à plusieurs et mettre les idées en commun). Ne pas être à Paris ne devrait pas poser de problème, et la plupart des échanges pourront, je pense, se faire via les outils numériques.
  • En termes de quantité de travail demandée : ce sera selon le nombre de personnes impliquées. Mais a priori il s’agit plutôt de mener une discussion et partager vos expériences quant à ces outils-là, et ensuite réfléchir à la manière de structurer l’outil. Puis la diffusion se fera avec l’aide de tous les shifters qui le voudront, et ne devrait pas être trop prenante.

Quelques idées mentionnées par mail : l’utilité de regarder et comparer les outils de partage de contenu déjà existantes et utilisées par les enseignants (moodle, workplace, slack).

Équipe

Elle est constituée de :

  • 2 référents, coordinateurs de la mission : Vincent Lefoulon et Delphine Chadefaux
  • 26 contributeurs

Calendrier

  • Semaine du 1er juillet : outil(s) choisi(s)
  • Semaine du 8 juillet : outils structurés et configurés
  • Semaine du 22 juillet : outils déployés et utilisables
  • Semaines suivantes : communication autour de l'outil, diffusion dans le monde de l'enseignement

Contenu de la mission

Etude du cahier des charges

Le terme « outil » désigne l'outil temporaire mis en place par les Shifters et non pas l'outil final.

Questions/remarques

On liste ici les potentiels points peu clairs du cahier des charges, les questions non soulevées...

  • L'outil devra-t-il être sous licence libre ?
  • Par qui sera-t-il déployé et maintenu (d'un point de vue informatique) ?
  • Qui maintiendra le contenu de la plateforme (alimentation, modération...) ?
  • Présence de données personnelles dans un compte d'utilisateur et probablement un profil, le RGPD doit être "légalement" appliqué.
  • Des contenus vont être mis en ligne. Peut se poser la question de la propriété intellectuelle et de la licence
  • Attention aux suites et aux applications gratuites sur le cloud. La sécurité et la confidentialité des données (si c'est un prérequis) ne sont pas nécessairement "garanties". L'ANSSI (Agence Nationale de la Sécurité des Systèmes d'Information) fait des recommandations en ce sens. En outre, certaines plateforme autorisent un nombre limité de messages.
  • Peut-on avoir plusieurs outils, à l'instar des Shifters qui travaillent avec Slack pour les discussions et un wiki pour le contenu persistent ?
  • "Possibilité pour les utilisateurs d’uploader des ressources pédagogiques accessibles à tous" -> "tous" inclut-il les personnes non inscrites sur la plateforme ?

Rencensement d'outils

Ce document recense plusieurs outils selon divers critères :

https://lite.framacalc.org/shifters_plateforme_pedago

Moodle

Du fait des fonctionnalités qu'elle fournit et de son usage dans le monde de l'enseignement, nous avons choisi la plateforme Moodle : https://moodle.org/

Une plateforme de test est disponible ici : http://159.122.174.23:30000

Configuration

Cette section décrit comment la plateforme a été configurée depuis son interface d'administration pour la rendre plus ergonomique et la faire correspondre à nos besoins.

Un ancien travail : https://lite.framacalc.org/shifters_moodle

URL de la page de paramétrage Paramétrage Raison (si non évidente) Auteur Date
/admin/tool/langimport/index.php Installer le pack "Français (fr)" Vincent 13/08/19
/admin/settings.php?section=langsettings "Langue par défaut" = "Français (fr)" Vincent 13/08/19
/admin/settings.php?section=frontpagesettings "Nom complet du site" = "Les Shifters" Vincent 13/08/19
/admin/settings.php?section=frontpagesettings "Nom abrégé du site" = "Les Shifters" Vincent 13/08/19
/admin/settings.php?section=frontpagesettings "Page d'accueil" =
  • "Zone de recherche de cours"
  • "Liste des cours"
Vincent 13/08/19
/admin/settings.php?section=frontpagesettings "Éléments de la page d'accueil, une fois connecté" =
  • "Zone de recherche de cours"
  • "Cours de l'utilisateurs"
  • "Liste des cours"
Vincent 13/08/19
/admin/settings.php?section=frontpagesettings "Nombre d'annonces" = 0 A priori, on n'utilisera pas les annonces. Vincent 13/08/19
Personnaliser le tableau de bord par défaut
/admin/settings.php?section=manageauths Activer le plugin "Auto-enregistrement par courriel" S'inscrire à la plateforme sans demander l'autorisation Vincent 13/08/19
/admin/settings.php?section=manageauths "Auto-enregistrement" = "Auto-enregistrement par courriel" S'inscrire à la plateforme sans demander l'autorisation Vincent 13/08/19
/admin/settings.php?section=manageauths "Permettre la connexion au moyen de l'adresse de courriel" = "Oui" (case cochée) Vincent 13/08/19
/admin/settings.php?section=enrolsettingsself "Autoriser les méthodes d'auto-inscription existantes" = "Oui" Participer à un cours sans demander l'autorisation Vincent 13/08/19
/admin/settings.php?section=enrolsettingsguest "Permettre l'accès anonyme" = "Oui" Lire les cours sans devoir se connecter Vincent 13/08/19
/admin/settings.php?section=userpolicies "Connecter automatiquement les visiteurs anonymes" = "Oui" Lire les cours sans devoir se connecter Vincent 13/08/19
/admin/settings.php?section=userpolicies "Rôle par défaut des utilisateurs" = "Créateur de cours" Créer un cours sans demander l'autorisation Tom 13/08/19
/admin/settings.php?section=outgoingmailconfig Un exemple avec le serveur SMTP de GMail :
  • "SMTP hosts" = "smtp.gmail.com:587"
  • "SMTP security" = "TLS"
  • "SMTP Auth Type" = "LOGIN"
  • "SMTP username" = "xxx@gmail.com"
  • "SMTP password" = mot de passe d'application
  • "No-reply address" = "xxx@gmail.com"

Pour tester : /admin/testoutgoingmailconf.php

Pour débugger : /admin/settings.php?section=debugging

Permettre l'envoi de mails (type confirmation d'inscription) Vincent 19/08/19

Déploiement informatique

Cette section décrit comment la plateforme a été déployée informatiquement.

On distingue 2 environnements: - un environnement de développement/test qui est un bac à sable temporaire, réservé à certains membres des shifters, permettant de mettre au point la plateforme (ergonomie, modules, etc). Liens: https://159.122.174.23:31000/, http://159.122.174.23:30000/ - et un environnement de production utilisée par les utilisateurs finaux (enseignants, chercheurs, etc), utilisant le paramétrage mis au point sur la plateforme de test. Lien: https://shifterscluster-prod.par01.containers.appdomain.cloud/

Ces 2 environnements sont hébergés sur la plateforme de Cloud de IBM. (cloud.ibm.com). Ils sont constitués tous deux d'un cluster Kubernetes executant des versions containerisées (Docker) de Moodle et de MariaDB.

Environnement de test
Création du cluster

- Création d’un groupe de resource ShiftersResourceGroup-Dev

- Création d’un Cluster Kubernetes gratuit (local node : 1 seule machine héberge le contrôleur et les worker nodes) sur ibmcloud (cloud.ibm.com) sur le Cloud Public zone Europe / Datacenters de Frankfort dans le groupe de ressources , nommé ShiftersCluster-Dev

- Association du cluster ShiftersCluster-Dev au groupe de ressources ShiftersResourceGroup-Dev

- Création d’un groupe d’accès (IAM) ShiftersAccessGroup

- Ajout de Vincent Lefoulon et Tom Domenge dans le groupe utilisateurs en tant qu’Editors

- Installation sur le poste de travail de quelques outils d'interface CLI ainsi que le plug-in Kubernetes Service. Sur MacOS la commande était:

curl -sL https://ibm.biz/idt-installer | bash

- Connection au cluster

ibmcloud login -a cloud.ibm.com -r eu-de -g ShiftersResourceGroup-Dev

Noeud final de l'API : https://cloud.ibm.com

Email> christian@chateauvieux.net

Password> Authentification... OK

Compte ciblé Christian Chateauvieux's Account (e57a5c5d7c8d46c0959d04a481877ee3) <-> 1957782

Groupe de ressources ciblé ShiftersResourceGroup-Dev

Région ciblée eu-de


Noeud final d'API : https://cloud.ibm.com Région : eu-de Utilisateur : christian@chateauvieux.net Compte : Christian Chateauvieux's Account (e57a5c5d7c8d46c0959d04a481877ee3) <-> 1957782 Groupe de ressources : ShiftersResourceGroup-Dev Noeuds finaux d'API CF : Organisation : Espace :

Astuce : si vous gérez les services et les applications Cloud Foundry - Utilisez 'ibmcloud target --cf' pour cibler l'organisation/l'espace Cloud Foundry de manière interactive ou utilisez 'ibmcloud target --cf-api ENDPOINT -o ORG -s SPACE' pour cibler l'organisation/l'espace. - Utilisez 'ibmcloud cf' si vous souhaitez exécuter l'interface de ligne de commande Cloud Foundry avec le contexte IBM Cloud CLI en cours.

- Téléchargement sur le poste local de la configuration du cluster

- ibmcloud ks cluster-config --cluster ShiftersCluster-Dev

OK La configuration de ShiftersCluster-Dev a été téléchargée correctement.

- Export des variables d'environnement pour commencer à utiliser Kubernetes.

export KUBECONFIG=/Users/Christian/.bluemix/plugins/container-service/clusters/ShiftersCluster-Dev/kube-config-mil01-ShiftersCluster-Dev.yml

- Création du role binding d'administration

kubectl create clusterrolebinding add-on-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default


- Initialisation du Tiller Helm sur le cluster

helm init --upgrade


- Ajout du repository Kubernetes

helm repo add kubernetes https://kubernetes-charts.storage.googleapis.com

"kubernetes" has been added to your repositories


Installation de Moodle via Helm Charts

- On se place dans moodle-for-shifters/ibmcloud/dev

cd moodle-for-shifters/ibmcloud/dev

- Création des espaces de stockage pour MariaDB et Moodle

kubectl apply -f persistentVolumeClaim-mariadb-dev.yaml 

persistentvolumeclaim/data-moodle-for-shifters-mariadb-0 created

kubectl apply -f persistentVolume-mariadb-dev.yaml 

persistentvolume/mariadb-data created

kubectl apply -f persistentVolumeClaim-moodle-dev.yaml 

persistentvolumeclaim/data-moodle-for-shifters created

kubectl apply -f persistentVolume-moodle-dev.yaml 

persistentvolume/moodle-data created

- Installation de Moodle

helm install --name moodle-for-shifters --values=values-dev.yaml kubernetes/moodle

NAME: moodle-for-shifters LAST DEPLOYED: Fri Aug 9 15:39:44 2019 NAMESPACE: default STATUS: DEPLOYED

RESOURCES: ==> v1/ConfigMap NAME DATA AGE moodle-for-shifters-mariadb 1 1s moodle-for-shifters-mariadb-tests 1 1s

==> v1/Pod(related) NAME READY STATUS RESTARTS AGE moodle-for-shifters-6d4f885986-kh7fp 0/1 ContainerCreating 0 1s moodle-for-shifters-mariadb-0 0/1 ContainerCreating 0 1s

==> v1/Secret NAME TYPE DATA AGE moodle-for-shifters Opaque 2 1s moodle-for-shifters-mariadb Opaque 2 1s

==> v1/Service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE moodle-for-shifters NodePort 172.21.99.116 <none> 80:30917/TCP,443:31037/TCP 1s moodle-for-shifters-mariadb ClusterIP 172.21.40.180 <none> 3306/TCP 1s

==> v1beta1/Deployment NAME READY UP-TO-DATE AVAILABLE AGE moodle-for-shifters 0/1 1 0 1s

==> v1beta1/StatefulSet NAME READY AGE moodle-for-shifters-mariadb 0/1 1s


NOTES:

    • Please be patient while the chart is being deployed **

1. Access you Moodle instance with:

 export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services moodle-for-shifters)
 export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
 echo "Moodle URL: http://$NODE_IP:$NODE_PORT/"

2. Login with the following credentials

 echo Username: admin
 echo Password: $(kubectl get secret --namespace default moodle-for-shifters -o jsonpath="{.data.moodle-password}" | base64 --decode)

- Le node port retourné ici est 30000 (HTTP) ou 31000 (HTTPS)

- Obtention de l'addresse IP du worker node de test

ibmcloud cs workers ShiftersCluster-Dev 

OK ID Adresse IP publique Adresse IP privée Version Etat Statut Zone Version kube-bl5d3k3f01qu1qq11tsg-shiftersclu-default-0000007f 159.122.175.176 10.144.195.184 free normal Ready mil01 1.13.8_1530

- Admin Moodle: admin | Mot de passe: Sh1ftmood4

- Exposition du port d'écoute (NOT WORKING...)

kubectl expose deployment moodle-for-shifters --type=NodePort --port=80 --name=moodle-service --target-port=31000

service/moodle-service exposed


Backup

Pour env test: https://appscode.com/products/stash/0.7.0/guides/backup/ Pour prod prendre version plus récente de stash

helm repo add appscode https://charts.appscode.com/stable/

"appscode" has been added to your repositories

helm repo update

Hang tight while we grab the latest from your chart repositories... ...Skip local chart repository ...Successfully got an update from the "appscode" chart repository ...Successfully got an update from the "stable" chart repository ...Successfully got an update from the "kubernetes" chart repository Update Complete.

helm install appscode/stash --name stash-operator --version v0.7.0

NAME: stash-operator LAST DEPLOYED: Tue Aug 13 10:28:31 2019 NAMESPACE: default STATUS: DEPLOYED

RESOURCES: ==> v1/ClusterRole NAME AGE stash-operator 5s

==> v1/ClusterRoleBinding NAME AGE stash-operator 5s stash-operator-apiserver-auth-delegator 5s

==> v1/Pod(related) NAME READY STATUS RESTARTS AGE stash-operator-574b4c4955-zkprw 0/2 ContainerCreating 0 5s

==> v1/RoleBinding NAME AGE stash-operator-apiserver-extension-server-authentication-reader 5s

==> v1/Secret NAME TYPE DATA AGE stash-operator-apiserver-cert Opaque 2 5s

==> v1/Service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE stash-operator ClusterIP 172.21.167.192 <none> 443/TCP,56789/TCP,56790/TCP 5s

==> v1/ServiceAccount NAME SECRETS AGE stash-operator 1 5s

==> v1beta1/Deployment NAME READY UP-TO-DATE AVAILABLE AGE stash-operator 0/1 1 0 5s


NOTES: To verify that Stash has started, run:

kubectl --namespace=default get deployments -l "release=stash-operator, app=stash"


kubectl apply -f ibmcloud/dev/backups/stash-backup-busybox.yaml 

deployment.apps/vol-backup created

kubectl get pods -l app=vol-backup

NAME READY STATUS RESTARTS AGE vol-backup-55bd5b9cf6-g84f2 1/1 Running 0 26s

kubectl create secret generic stash-backup --from-literal=RESTIC_PASSWORD=passStash

secret/stash-backup created

kubectl get secret stash-backup -o yaml

apiVersion: v1 data:

 RESTIC_PASSWORD: cGFzc1N0YXNo

kind: Secret metadata:

 creationTimestamp: "2019-08-13T08:47:50Z"
 name: stash-backup
 namespace: default
 resourceVersion: "117674"
 selfLink: /api/v1/namespaces/default/secrets/stash-backup
 uid: 083d2ead-bda7-11e9-a8d3-8a44d1251ba5

type: Opaque

kubectl apply -f ibmcloud/dev/backups/restic.yaml 

restic.stash.appscode.com/vol-backup created

kubectl get pods -l app=vol-backup

NAME READY STATUS RESTARTS AGE vol-backup-55bd5b9cf6-g84f2 1/1 Terminating 0 25m vol-backup-c9b5575f4-2mw52 2/2 Running 0 26s

kubectl get deployment vol-backup -o yaml

apiVersion: extensions/v1beta1 kind: Deployment metadata:

 annotations:
   deployment.kubernetes.io/revision: "2"
   kubectl.kubernetes.io/last-applied-configuration: |
     {"apiVersion":"apps/v1beta1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"vol-backup"},"name":"vol-backup","namespace":"default"},"spec":{"replicas":1,"template":{"metadata":{"labels":{"app":"vol-backup"},"name":"busybox"},"spec":{"containers":[{"command":["sleep","3600"],"image":"busybox","imagePullPolicy":"IfNotPresent","name":"busybox","volumeMounts":[{"mountPath":"/bitnami","name":"source-data"}]}],"restartPolicy":"Always","volumes":[{"name":"source-data","persistentVolumeClaim":{"claimName":"data-moodle-for-shifters-mariadb-0"}}]}}}}
   restic.appscode.com/last-applied-configuration: |
     {"kind":"Restic","apiVersion":"stash.appscode.com/v1alpha1","metadata":{"name":"vol-backup","namespace":"default","selfLink":"/apis/stash.appscode.com/v1alpha1/namespaces/default/restics/vol-backup","uid":"66ea3532-bdaa-11e9-a8d3-8a44d1251ba5","resourceVersion":"117969","generation":1,"creationTimestamp":"2019-08-13T09:11:58Z","annotations":{"kubectl.kubernetes.io/last-applied-configuration":"{\"apiVersion\":\"stash.appscode.com/v1alpha1\",\"kind\":\"Restic\",\"metadata\":{\"annotations\":{},\"name\":\"vol-backup\",\"namespace\":\"default\"},\"spec\":{\"backend\":{\"local\":{\"hostPath\":{\"path\":\"/tmp/stash-backup/restic-repo\"},\"mountPath\":\"/safe/data\"},\"storageSecretName\":\"stash-backup\"},\"fileGroups\":[{\"path\":\"/bitnami\",\"retentionPolicyName\":\"keep-last-5\"}],\"retentionPolicies\":[{\"keepLast\":5,\"name\":\"keep-last-5\",\"prune\":true}],\"schedule\":\"@every 1m\",\"selector\":{\"matchLabels\":{\"app\":\"vol-backup\"}},\"volumeMounts\":[{\"mountPath\":\"/bitnami\",\"name\":\"source-data\"}]}}\n"}},"spec":{"selector":{"matchLabels":{"app":"vol-backup"}},"fileGroups":[{"path":"/bitnami","retentionPolicyName":"keep-last-5"}],"backend":{"storageSecretName":"stash-backup","local":{"hostPath":{"path":"/tmp/stash-backup/restic-repo"},"mountPath":"/safe/data"}},"schedule":"@every 1m","volumeMounts":[{"name":"source-data","mountPath":"/bitnami"}],"resources":{},"retentionPolicies":[{"name":"keep-last-5","keepLast":5,"prune":true}]}}
   restic.appscode.com/tag: 0.7.0
 creationTimestamp: "2019-08-13T08:46:40Z"
 generation: 2
 labels:
   app: vol-backup
 name: vol-backup
 namespace: default
 resourceVersion: "118004"
 selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/vol-backup
 uid: de5d4959-bda6-11e9-a8d3-8a44d1251ba5

spec:

 progressDeadlineSeconds: 600
 replicas: 1
 revisionHistoryLimit: 2
 selector:
   matchLabels:
     app: vol-backup
 strategy:
   rollingUpdate:
     maxSurge: 25%
     maxUnavailable: 25%
   type: RollingUpdate
 template:
   metadata:
     annotations:
       restic.appscode.com/resource-hash: "6494818429900406018"
     creationTimestamp: null
     labels:
       app: vol-backup
     name: busybox
   spec:
     containers:
     - command:
       - sleep
       - "3600"
       image: busybox
       imagePullPolicy: IfNotPresent
       name: busybox
       resources: {}
       terminationMessagePath: /dev/termination-log
       terminationMessagePolicy: File
       volumeMounts:
       - mountPath: /bitnami
         name: source-data
     - args:
       - backup
       - --restic-name=vol-backup
       - --workload-kind=Deployment
       - --workload-name=vol-backup
       - --docker-registry=appscode
       - --image-tag=0.7.0
       - --run-via-cron=true
       - --pushgateway-url=http://stash-operator.default.svc:56789
       - --enable-analytics=true
       - --enable-rbac=true
       - --logtostderr=false
       - --alsologtostderr=false
       - --v=3
       - --stderrthreshold=0
       env:
       - name: NODE_NAME
         valueFrom:
           fieldRef:
             apiVersion: v1
             fieldPath: spec.nodeName
       - name: POD_NAME
         valueFrom:
           fieldRef:
             apiVersion: v1
             fieldPath: metadata.name
       - name: APPSCODE_ANALYTICS_CLIENT_ID
         value: d41d8cd98f00b204e9800998ecf8427e
       image: appscode/stash:0.7.0
       imagePullPolicy: IfNotPresent
       name: stash
       resources: {}
       terminationMessagePath: /dev/termination-log
       terminationMessagePolicy: File
       volumeMounts:
       - mountPath: /tmp
         name: stash-scratchdir
       - mountPath: /etc/stash
         name: stash-podinfo
       - mountPath: /bitnami
         name: source-data
         readOnly: true
       - mountPath: /safe/data
         name: stash-local
     dnsPolicy: ClusterFirst
     restartPolicy: Always
     schedulerName: default-scheduler
     securityContext: {}
     terminationGracePeriodSeconds: 30
     volumes:
     - name: source-data
       persistentVolumeClaim:
         claimName: data-moodle-for-shifters-mariadb-0
     - emptyDir: {}
       name: stash-scratchdir
     - downwardAPI:
         defaultMode: 420
         items:
         - fieldRef:
             apiVersion: v1
             fieldPath: metadata.labels
           path: labels
       name: stash-podinfo
     - hostPath:
         path: /tmp/stash-backup
         type: ""
       name: stash-local

status:

 availableReplicas: 1
 conditions:
 - lastTransitionTime: "2019-08-13T08:46:43Z"
   lastUpdateTime: "2019-08-13T08:46:43Z"
   message: Deployment has minimum availability.
   reason: MinimumReplicasAvailable
   status: "True"
   type: Available
 - lastTransitionTime: "2019-08-13T08:46:40Z"
   lastUpdateTime: "2019-08-13T09:12:00Z"
   message: ReplicaSet "vol-backup-c9b5575f4" has successfully progressed.
   reason: NewReplicaSetAvailable
   status: "True"
   type: Progressing
 observedGeneration: 2
 readyReplicas: 1
 replicas: 1
 updatedReplicas: 1

KristMac:moodle-for-shifters Christian$ kubectl get repository -l workload-name=vol-backup NAME AGE deployment.vol-backup 1m


kubectl get repository deployment.vol-backup -o yaml


Pause backups: kubectl patch restic vol-backup --type="merge" --patch='{"spec": {"paused": true}}'

resume kubectl patch restic vol-backup --type="merge" --patch='{"spec": {"paused": false}}'



Retrieve apply -f ibmcloud/dev/backups/persistentVolumeClaim-moodle-backup-dev.yaml persistentvolumeclaim/data-moodle-backup created KristMac:moodle-for-shifters Christian$ kubectl apply -f ibmcloud/dev/backups/persistentVolume persistentVolume-moodle-backup-dev.yaml persistentVolumeClaim-moodle-backup-dev.yaml KristMac:moodle-for-shifters Christian$ kubectl apply -f ibmcloud/dev/backups/persistentVolume-moodle-backup-dev.yaml persistentvolume/moodle-backup created KristMac:moodle-for-shifters Christian$ kubectl apply -f ibmcloud/dev/backups/stash-backup-access.yaml deployment.apps/stash-backup-access created

kubectl cp default/stash-backup-access-97c8667f7-fmrbf:safe/data ibmcloud/dev/backups/


Restore (ne pas oublier de copier le backup dans Safe)

apply -f ibmcloud/dev/backups/restore.yaml 

recovery.stash.appscode.com/vol-backup created

 kubectl get recovery vol-backup -o yaml

apiVersion: stash.appscode.com/v1alpha1 kind: Recovery metadata:

 annotations:
   kubectl.kubernetes.io/last-applied-configuration: |
     {"apiVersion":"stash.appscode.com/v1alpha1","kind":"Recovery","metadata":{"annotations":{},"name":"vol-backup","namespace":"default"},"spec":{"paths":["/bitnami"],"recoveredVolumes":[{"hostPath":{"path":"/tmp/data"},"mountPath":"/bitnami"}],"repository":{"name":"deployment.vol-backup","namespace":"default"}}}
 creationTimestamp: "2019-08-13T12:28:34Z"
 generation: 3
 name: vol-backup
 namespace: default
 resourceVersion: "131715"
 selfLink: /apis/stash.appscode.com/v1alpha1/namespaces/default/recoveries/vol-backup
 uid: de2f636e-bdc5-11e9-a8d3-8a44d1251ba5

spec:

 paths:
 - /bitnami
 recoveredVolumes:
 - hostPath:
     path: /tmp/data
   mountPath: /bitnami
 repository:
   name: deployment.vol-backup
   namespace: default

status:

 phase: Succeeded



creation d’un cloud object storage dans le groupe shiftersResource-Dev bucket moodle-data-backup classe de stockage standard creation d’un access key pour restic {

 "apikey": "lU4Xy8L23yq3GXoXHjnpp7mFiySuQg1E_ZNVQJcbgvAO",
 "cos_hmac_keys": {
   "access_key_id": "73aac49ac6104e709352098648794c72",
   "secret_access_key": "7379b2d45ae9f37b4653da77b0b6e479b423c77de5fcff29"
 },
 "endpoints": "https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints",
 "iam_apikey_description": "Auto-generated for key 73aac49a-c610-4e70-9352-098648794c72",
 "iam_apikey_name": "Restic-Service-credentials",
 "iam_role_crn": "crn:v1:bluemix:public:iam::::serviceRole:Writer",
 "iam_serviceid_crn": "crn:v1:bluemix:public:iam-identity::a/e57a5c5d7c8d46c0959d04a481877ee3::serviceid:ServiceId-bcf15027-97f8-4213-84ea-6162597e7e48",
 "resource_instance_id": "crn:v1:bluemix:public:cloud-object-storage:global:a/e57a5c5d7c8d46c0959d04a481877ee3:4c56b257-15b0-43ab-b2e5-58e4190223b1::"

}


echo -n 'passStash' > ibmcloud/dev/backups/RESTIC_PASSWORD
echo -n '73aac49ac6104e709352098648794c72'  > ibmcloud/dev/backups/AWS_ACCESS_KEY_ID
echo -n '7379b2d45ae9f37b4653da77b0b6e479b423c77de5fcff29' > ibmcloud/dev/backups/AWS_SECRET_ACCESS_KEY
kubectl create secret generic s3-secret \
    --from-file=ibmcloud/dev/backups/RESTIC_PASSWORD \
    --from-file=ibmcloud/dev/backups/AWS_ACCESS_KEY_ID \
    --from-file=ibmcloud/dev/backups/AWS_SECRET_ACCESS_KEY 

secret/s3-secret created


apply -f ibmcloud/dev/backups/restic-s3.yaml 

restic.stash.appscode.com/s3-restic created

Environnement de production
Création du cluster

- Création d’un groupe de resource ShiftersResourceGroup-Prod

- Création d’un Cluster Kubernetes payant (1 machine héberge le contrôleur et 1 worker node) sur ibmcloud (cloud.ibm.com) sur le Cloud Public zone Europe / Datacenters de Paris dans le groupe de ressources , nommé ShiftersCluster-Prod

- Association du cluster ShiftersCluster-Prod au groupe de ressources ShiftersResourceGroup-Prod

- Création d’un groupe d’accès (IAM) ShiftersAccessGroup

- Ajout de Vincent Lefoulon et Tom Domenge dans le groupe utilisateurs en tant qu’Editors

- Installation sur le poste de travail de quelques outils d'interface CLI ainsi que le plug-in Kubernetes Service. Sur MacOS la commande était:

curl -sL https://ibm.biz/idt-installer | bash

- Connection au cluster

ibmcloud login -a cloud.ibm.com -r eu-de -g ShiftersResourceGroup-Prod

Noeud final de l'API : https://cloud.ibm.com

Email> christian@chateauvieux.net

Password> Authentification... OK

Compte ciblé Christian Chateauvieux's Account (e57a5c5d7c8d46c0959d04a481877ee3) <-> 1957782

Groupe de ressources ciblé ShiftersResourceGroup-Prod

Région ciblée eu-de


Noeud final d'API : https://cloud.ibm.com Région : eu-de Utilisateur : christian@chateauvieux.net Compte : Christian Chateauvieux's Account (e57a5c5d7c8d46c0959d04a481877ee3) <-> 1957782 Groupe de ressources : ShiftersResourceGroup-Prod Noeuds finaux d'API CF : Organisation : Espace :

Astuce : si vous gérez les services et les applications Cloud Foundry - Utilisez 'ibmcloud target --cf' pour cibler l'organisation/l'espace Cloud Foundry de manière interactive ou utilisez 'ibmcloud target --cf-api ENDPOINT -o ORG -s SPACE' pour cibler l'organisation/l'espace. - Utilisez 'ibmcloud cf' si vous souhaitez exécuter l'interface de ligne de commande Cloud Foundry avec le contexte IBM Cloud CLI en cours.

- Téléchargement sur le poste local de la configuration du cluster

ibmcloud ks cluster-config --cluster ShiftersCluster-Prod

OK La configuration de ShiftersCluster-Prod a été téléchargée correctement.


- Export des variables d'environnement pour commencer à utiliser Kubernetes.

export KUBECONFIG=/Users/Christian/.bluemix/plugins/container-service/clusters/ShiftersCluster-Prod/kube-config-par01-ShiftersCluster-Prod.yml

- Création du role binding d'administration

kubectl create clusterrolebinding add-on-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default


- Initialisation du Tiller Helm sur le cluster

helm init --upgrade


- Ajout du repository Kubernetes

helm repo add kubernetes https://kubernetes-charts.storage.googleapis.com

"kubernetes" has been added to your repositories


Installation de Moodle via Helm Charts

- On se place dans moodle-for-shifters/ibmcloud/prod

cd moodle-for-shifters/ibmcloud/prod

- PersistentVolumeClaim

kubectl apply -f persistentVolumeClaim-moodle-prod.yaml 

persistentvolumeclaim/data-moodle-for-shifters created

kubectl apply -f persistentVolumeClaim-mariadb-prod.yaml 

persistentvolumeclaim/data-moodle-for-shifters-mariadb-0 created

- Installation de Moodle

helm install --name moodle-for-shifters --values=values-prod.yaml kubernetes/moodle

NAME: moodle-for-shifters LAST DEPLOYED: Fri Aug 9 15:39:44 2019 NAMESPACE: default STATUS: DEPLOYED

RESOURCES: ==> v1/ConfigMap NAME DATA AGE moodle-for-shifters-mariadb 1 1s moodle-for-shifters-mariadb-tests 1 1s

==> v1/Pod(related) NAME READY STATUS RESTARTS AGE moodle-for-shifters-6d4f885986-kh7fp 0/1 ContainerCreating 0 1s moodle-for-shifters-mariadb-0 0/1 ContainerCreating 0 1s

==> v1/Secret NAME TYPE DATA AGE moodle-for-shifters Opaque 2 1s moodle-for-shifters-mariadb Opaque 2 1s

==> v1/Service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE moodle-for-shifters NodePort 172.21.99.116 <none> 80:30917/TCP,443:31037/TCP 1s moodle-for-shifters-mariadb ClusterIP 172.21.40.180 <none> 3306/TCP 1s

==> v1beta1/Deployment NAME READY UP-TO-DATE AVAILABLE AGE moodle-for-shifters 0/1 1 0 1s

==> v1beta1/StatefulSet NAME READY AGE moodle-for-shifters-mariadb 0/1 1s


NOTES:

    • Please be patient while the chart is being deployed **

1. Access you Moodle instance with:

 export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services moodle-for-shifters)
 export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
 echo "Moodle URL: http://$NODE_IP:$NODE_PORT/"

2. Login with the following credentials

 echo Username: user
 echo Password: $(kubectl get secret --namespace default moodle-for-shifters -o jsonpath="{.data.moodle-password}" | base64 --decode)

- Le node port retourné ici est 80

- Obtention de l'addresse IP du worker node de test

ibmcloud cs workers ShiftersCluster-Prod 
-> 159.8.83.19

- Admin Moodle: user | Mot de passe: Apxseo4m5e

Installation via Docker (Non utilisée)
ibmcloud cr namespace-add shifters

Ajout de l'espace de nom 'shifters'...

Espace de nom ajouté avec succès 'shifters'

OK

docker pull stable/moodle
docker tag bitnami/moodle de.icr.io/shifters/repo:moodle
ibmcloud cr login

Connexion à 'registry.eu-de.bluemix.net'... Connecté à 'registry.eu-de.bluemix.net'.

IBM Cloud Container Registry is adopting new icr.io domain names to align with the rebranding of IBM Cloud for a better user experience. The existing bluemix.net domain names are deprecated, but you can continue to use them for the time being, as an unsupported date will be announced later. For more information about registry domain names, see https://cloud.ibm.com/docs/services/Registry?topic=registry-registry_overview#registry_regions_local

Connexion à 'de.icr.io'... Connecté à 'de.icr.io'.

IBM Cloud Container Registry is adopting new icr.io domain names to align with the rebranding of IBM Cloud for a better user experience. The existing bluemix.net domain names are deprecated, but you can continue to use them for the time being, as an unsupported date will be announced later. For more information about registry domain names, see https://cloud.ibm.com/docs/services/Registry?topic=registry-registry_overview#registry_regions_local

OK

docker push de.icr.io/shifters/repo:moodle