Retrouvez le sur www.theshifters.org
Plateforme pédagogique
| 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 :
- 1 référent, coordinateur de la mission : Vincent Lefoulon
- 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 ?
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.175.176:31000/, http://159.122.175.176: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
- 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
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/
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" =
|
Vincent | 13/08/19 | |
| /admin/settings.php?section=frontpagesettings | "Éléments de la page d'accueil, une fois connecté" =
|
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 |