Blog de dada

DevOps, bidouilleur et routard plein de logiciels libres

Archives novembre 2018

Retours sur /e/ dans un OnePlus 5T

Rédigé par dada / 26 novembre 2018 / 16 commentaires



C'est donc un dimanche soir, vers 18h, que j'ai décidé de faire ce que j'avais quasiment juré d'arrêter : changer l'OS de mon téléphone.
Je fais partie de celles et ceux qui se sont jetés sur FirefoxOS en y croyant, puis sur Ubuntu Touch, en y croyant déjà moins. L'expérience des abandons et des échecs m'avait pourtant bien fait comprendre que les OS alternatifs sur un objet aussi important que le mobile étaient une mauvaise idée. Et pourtant. Merci Monseigneur.

/e/ ?

Ne me demandez pas comment ça se prononce. Pas la moindre idée. C'est pourtant un OS alternatif basé sur Android dont on entend souvent parler sur Mastodon. N'essayez pas de retrouver le hashtag qui va bien, le nom de l'OS ne permet pas d'en faire une pub correcte. C'est le compte de Gaël Duval qu'il faut suivre pour se tenir informé.
Pour plus d'informations, je vous redirige vers le site officiel de la fondation derrière ce projet. Il faut simplement retenir que l'OS se veut respectueux de la vie privée : ciao les Google Apps, Services et autres cochonneries installées de force dans votre mobile.

/e/ est un projet à but non lucratif, dans l’intérêt de tous. Nous concevons des systèmes d’exploitation mobile open source et des services en lignes associés, qui respectent la vie privée et les données personnelles de chacun.
Nous sommes une équipe internationale d’entrepreneurs expérimentés, de développeurs et de designers, qui s’appuie sur une communauté de contributeurs grandissante.

À quoi ça ressemble ?

 

Pas grand-chose à raconter. C'est une version propre d'Android avec un thème et un jeu d'icônes personnalisés.

Les applications par défaut

On retrouve les grands classiques bien connus des libristes :
  • K9Mail pour gérer les mails
  • Signal et Telegram pour les SMS & co
  • Chrome (Chromium ?) comme navigateur par défaut
  • Davdroid pour gérer les carnets d'adresses distants
  • Etar pour le calendrier
  • Notes pour la prise de notes
  • Tasks comme gestionnaire de tâches
  • Magic Earth pour le GPS
  • Nextcloud comme gestionnaire de fichiers
  • Open Camera pour la photo
Personnellement, je ne comprends pas le choix de Chromium. Je reste un adorateur de Mozilla, avec tous les travers que cela entraîne.
Leur navigateur vient avec une configuration particulière : il a pour moteur de recherche par défaut l'instance Searx de la /e/ Foundation.

Sous le capot

Sous le capot, on retrouve une version 8.1.0 d'Android avec les correctifs de sécurité datés du 5 novembre. En passant par la page d'installation de l'OS, on remarque que c'est effectivement une version de LineageOS remastérisée à la sauce /e/. Mastodon me raconte qu'un OS débarrassé des services Google et avec des services de synchronisation, ça existait : CyanogenMod.

Des services ?

Un mail

Si vous en faites la demande, ça n'a rien d'obligatoire, vous pouvez demander la création d'un compte en @e.email. Ce faisant, vous obtiendrez une nouvelle adresse à ajouter entre celle qui sert pour le boulot, la Gmail à spam et la Protonmail qui va bien. Une fois le compte créé, c'est sur un Rainloop que vous allez atterrir.


Sauvegarde des comptes et fichiers



J'ai l'impression qu'ils ont une instance Nextcloud sur leurs serveurs. La liste des applications permet de ne pas trop en douter. C'est une solution simple et bien supportée pour synchroniser tout le contenu important d'un téléphone moderne.

Le magasin d'applications

Là, j'ai un peu froncé les sourcils : il n'y a pas de store par défaut. Si vous en voulez un, c'est à vous d'aller le choper en passant par le navigateur. C'est une manipulation marrante : lancer le navigateur pour aller taper sur une instance Searx et enfin télécharger, disons, F-droid, c'est un truc qu'on ne fait pas souvent.

F-droid

Une fois installé à la main, F-droid ne pose pas de problème. Tout roule. J'ai installé une version complète de Nextcloud, Fennec (Firefox), Maps, Silence pour mes SMS et Tusky.

Aurora Store

C'est encore sur Mastodon qu'on m'a conseillé ce store. Aurora est un fork de Yalp. Il permet d'aller récupérer sereinement vos applications uniquement disponibles sur le Play Store de Google.  J'ai réussi à installer mes applications critiques : ProtonMail, ProtonVPN, les applications SNCF et celle de ma banque. Et ça marche. Au choix, vous pouvez vous connecter avec votre compte Google pour retrouver les applications que vous auriez achetées ou passer par leur service anonyme.

Des soucis ?

À l'installation de Tusky, le navigateur qui vient avec /e/ ne m'a pas permis d'autoriser la connexion à mon instance. J'ai dû installer Fennec depuis F-droid et le configurer comme navigateur par défaut pour y arriver.
Autant j'ai réussi à installer des applications du Play Store depuis Aurora sans problème et réussir à m'en servir, autant l'application Qobuz s'est lamentablement vautrée. Rien à faire, elle ne démarre pas. Moi qui envisageais de m'y abonner pour de bon, c'est mal barré. C'est corrigé.

Est-ce que c'est vraiment utilisable ?

OnePlus 5T

Pour le moment, pas grand-chose à signaler. /e/ fonctionne et permet de renouer avec un Android propre. Mon téléphone supporte bien la chose. Même le lecteur d'empreinte fonctionne. J'aimerais bien réussir à le configurer non pas pour qu'il lise le bout de mes doigts mais pour m'en servir comme pavé tactile. Je n'ai pas encore retrouvé l'option.
Au niveau de l'appareil photo, chose pour laquelle j'avais décidé d'acheter un OnePlus 5T, je doute qu'on retrouve le même niveau de qualité que sur OxygenOS. Par exemple, je ne retrouve pas la possibilité de passer par le zoom optique du deuxième capteur. Après, je ne m'en sers jamais. Quant à l'application Open Camera, elle semble quand même fournir une foule d'options intéressantes. N'oubliez pas d'aller régler la résolution à fond dans les options si vous vous voulez retrouver quelque chose qui se rapproche de ce que vous aviez avant.

En général

Avant de vous lancer dans l'aventure, n'oubliez pas que l'absence de Play Store va vous pénaliser d'une façon ou d'une autre. L’intégration de MicroG permet de vivoter mais n'apporte pas de miracle. Les applications sont de plus en plus dépendantes des services Google pour fonctionner. Google a réussi son coup : les développeurs ne regardent même plus ce qu'il y a dans leur SDK et ajoutent des dépendances dégueulasses à la truelle.

Gardez aussi à l'esprit que c'est un OS en version alpha, à utiliser à vos risques et périls.

Je me souviens de l'époque de FirefoxOS : nous étions beaucoup à avoir spécialement acheté les téléphones siglés pour pouvoir nous en servir. J'avais spécialement commandé le téléphone de référence des développeurs, le Flame, pour en avoir un peu plus sous le capot. Certains avaient même pris de leur temps pour aller en faire la promotion dans des grandes surfaces. Une période assez dingue quand on y repense. Le choix de /e/ loin des délires de Mozilla me rassure, un peu. La suite ? On verra.

Liens utiles :

Prometheus et Graphana pour voir dans son cluster Kubernetes

Rédigé par dada / 23 novembre 2018 / Aucun commentaire


Mes aventures avec Kubernetes ne se sont pas arrêtées, loin de là. J'ai actuellement 54 pods répartis sur 3 nodes et 1 master et 2 VM MariaDB en master/slave, le tout reparti sur mon laptop, mon PC fixe et un vieux PC portable datant de ma vie étudiante. Je pourrais aussi vous parler de mon Pi-Hole sur ma Raspberry qui voit passer toutes les requêtes. Bref.
Aujourd'hui, alors que je peste contre ProxySQL sur Mastodon, j'ai décidé de regarder du côté du monitoring de l'orchestrateur, histoire de prendre l'air. Si vous êtes un malheureux lecteur régulier, vous devriez savoir que j'adore Prometheus et que Grafana fait, à mes yeux, des dessins bien plus impressionnants que Klimt.

Note : ça n'a pas calmé ma frustration : c'est très rapide et simple à mettre en place.

Installer Prometheus

Avec pour base mes billets précédents, nous allons installer Prometheus, Grafana et l'AlertManager avec Helm.

Ajouter le dépôt dans helm

Là, à la manière d'APT, nous allons ajouter une source à Helm pour lui permettre d'installer ce qu'on lui demande.

helm repo add coreos https://s3-eu-west-1.amazonaws.com/coreos-charts/stable/

Installer l'operator

On enchaîne sur l'installation de l'operator, le grand patron qui va s'occuper pour nous de Prometheus dans k8s.

helm install coreos/prometheus-operator --name prometheus-operator --namespace monitoring

Installer les kubes

Les Kubes sont des pods qui vont se poser sur nos différents nodes et sur le master afin de remonter les metrics. Ce sont, en gros, nos exporters.

helm install coreos/prometheus-operator --name prometheus-operator --namespace monitoring

Une fois ces quelques commandes exécutées, vous devriez voir ça :

dada@master:~/prometheus$ kubectl get pods -n monitoring -o wide
NAME                                                   READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE
alertmanager-kube-prometheus-0                         2/2     Running   0          37m   10.244.3.140   node3    <none>
kube-prometheus-exporter-kube-state-65b6dbf6b4-b52jl   2/2     Running   0          33m   10.244.3.141   node3    <none>
kube-prometheus-exporter-node-5tnsl                    1/1     Running   0          37m   192.168.0.76   node1    <none>
kube-prometheus-exporter-node-fd7pt                    1/1     Running   0          37m   192.168.0.49   node3    <none>
kube-prometheus-exporter-node-mfdj2                    1/1     Running   0          37m   192.168.0.22   node2    <none>
kube-prometheus-exporter-node-rg5q6                    1/1     Running   0          37m   192.168.0.23   master   <none>
kube-prometheus-grafana-6f6c894c5b-2d6h4               2/2     Running   0          37m   10.244.2.165   node2    <none>
prometheus-kube-prometheus-0                           3/3     Running   1          37m   10.244.1.187   node1    <none>
prometheus-operator-87779759-wkpfz                     1/1     Running   0          49m   10.244.1.185   node1    <none>

Notez que si vous êtes, comme moi, sur une connexion ADSL classique, vous aller avoir le temps d'aller faire couler un grand café et d'aller le boire une clope au bec et au soleil. Votre cluster va télécharger beaucoup de pods et sur chaque nœud.

En y regardant bien, on retrouve :

  • L'AlertManager permettant de nous spammer en cas de souci,
  • Les exporter nodes placés logiquement sur chaque node et sur notre master,
  • Grafana, le copain de Prometheus qui vous fait des beaux dessins,
  • Le kube et l'operator.

Accéder à tout ça

L'installation est vraiment triviale. Le petit bonus de ce billet sera de vous passer une liste de commandes pour admirer le tout dans votre navigateur préféré : Firefox.

Pour accéder à l'interface de Prometheus

Commencez par ouvrir un tunnel SSH sur le port 9090 vers votre master :

ssh -L 9090:127.0.0.1:9090 dada@IPDuMaster

Puis lancez le port-foward :

kubectl port-forward -n monitoring prometheus-kube-prometheus-0 9090

Pour accéder à l'interface de Grafana

Encore un tunnel SSH, sur le 3000 ce coup-ci :

ssh -L 3000:127.0.0.1:3000 dada@IPDuMaster

Et encore un port-forward :

kubectl port-forward $(kubectl get  pods --selector=app=kube-prometheus-grafana -n  monitoring --output=jsonpath="{.items..metadata.name}") -n monitoring  3000

Vous êtes bons ! Les dashboards sont maintenant accessibles en tapant http://localhost:PORT dans Firefox.

En image, ça devrait donner ça pour Grafana :

Et ça pour les alertes Prometheus :

Alors, oui. Vous avez aussi remarqué que des alertes étaient déjà levées ? Ce sont des outils/configurations que Prometheus attend de rencontrer dans votre cluster. Le mien n'a pas encore ces histoires de scheduler ou de controller manager. Ça va faire partie des découvertes à suivre dans les futurs billets.

Des bisous !

Prismo, le Reddit du fediverse

Rédigé par dada / 13 novembre 2018 / 5 commentaires


Je suis accroc à tout ce qui tourne autour de la fédération. Vraiment. Mon compte Mastodon tourne à plein régime et mon compte Pixelfed aussi, même s'il est en attente de réelle fédération, qui arrive.
Bref.
Dans la famille, nous pouvons maintenant ajouter un nouveau : Prismo !

C'est quoi ?

Prismo, c'est une sorte de Reddit, mais un Reddit fédéré, ou encore un Journal du Hacker. Il permet de partager des liens, d'en avoir un aperçu, de commenter ou encore de laisser la communauté en évaluer la pertinence avec des +1 ou des -1 et d'ainsi les faire apparaître sur la page d'accueil, bien en avant.

En images :


Vous avez ci-dessus la page d'accueil avec l'accès aux Stories, aux Comments et la liste des tags du moment. La page "Hot" permet d'accéder aux liens qui viennent d'être balancés, triés uniquement par date d'ajout.


Ci-dessus, un lien balancé par Valere. Même si l'article est super intéressant, ce sont des commentaires dont nous allons parler. Mon commentaire vient de mon compte Mastodon tout comme la réponse de Valere :


On se retrouve bien dans un cas typique de fédération ! Quand un lien est donné à manger à Prismo, celui-ci est directement envoyé dans notre univers fédéré, Mastodon en l’occurrence. Les interactions sont transmises dans les deux sens et tout le monde peut participer. C'est beau. Et vous avez des notifications pour vous alerter.

Prismo étant encore en développement, tout est encore possible. Dans les tuyaux, on peut déjà espérer voir rapidement arriver la fédération entre instances pour mettre en commun leurs communautés.
J'attends aussi l'arrivée d'un flux RSS, histoire de voir passer les nouvelles sur Mastodon mais aussi dans mon FreshRSS.
Une application Android/iOS ? Si des développeurs se motivent pour nous pondre ça, il y en aura. En attendant, la version mobile fonctionne bien.

L'utilité

Dans mon cas, je ne sais pas encore ce que je vais faire de ce nouvel outil. Je sais que je balance une quantité non négligeable de liens vers des articles autour de la politique internationale, du droit ou des nouvelles technologies. C'est un peu le cœur de métier de mon compte Mastodon. Est-ce que je vais déplacer tout ça dans une instance Prismo ? Je ne sais pas mais je vais y penser.

Par contre, si vous êtes un adepte de la veille technologiques et que vous n'avez pas vraiment d'intérêt à maintenir un compte Mastodon, vous êtes la cible privilégiée du petit nouveau. Il pourrait remplacer votre Shaarli ou vos billets de blog regroupant vos lectures de la semaine.

Où tester ?

Si vous êtes tentés par l'expérience, foncez faire un compte chez Hostux.news ! L'instance est gérée par Valere, ou Valere, ou Valere ou encore Valere.



On vous y attend pour découvrir ce que vous avez à nous faire lire !

Et si on mettait PluXml dans un cluster k8s ?

Rédigé par dada / 11 novembre 2018 / Aucun commentaire



L'idée est saugrenue mais c'est exactement ce que j'ai fait ces derniers temps. Non sans souffrir, j'ai réussi à m'en sortir. Au programme : créer un conteneur qui va bien pour PluXml, mettre en place un déploiement pour le faire tourner dans k8s et l'utilisation de PersistentVolume.

Notez que je découvre toujours cet univers et que ce qui est présenté dans ce billet ne reflète que mes avancées.

La création du conteneur

Introduction

J'ai déjà pondu quelques conteneurs, principalement des exporters Prometheus en Python qui vont récupérer les statistiques de Mastodon et Pixelfed pour les afficher dans des dashboards Grafana (combo mots clés pour des recruteurs).

Pour PluXml, c'est différent. Il nous faut un conteneur avec :
- Les sources du CMS
- Du php7 et ses dépendances
- Un serveur web

Voyons comment y arriver en s'inspirant de ce qui a été fait pour Wordpress.

Le Dockerfile

C'est quoi ? C'est le fichier de configuration qui va nous permettre de créer le conteneur. En gros, les sources du conteneur.
FROM php:7.0-apache

WORKDIR /var/www/html

RUN apt update
RUN apt install -y wget unzip
RUN wget https://git.dadall.info/dada/pluxml/raw/master/pluxml-latest.zip
RUN mv pluxml-latest.zip /usr/src/

#VOLUME
VOLUME /var/www/html

RUN a2enmod rewrite
RUN service apache2 restart
RUN apt-get update && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libpng-dev \
    && docker-php-ext-install -j$(nproc) iconv \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd

# Expose
EXPOSE 80

COPY entrypoint.sh /usr/local/bin/

ENTRYPOINT ["entrypoint.sh"]
CMD ["apache2-foreground"]

Comprendre le Dockerfile

FROM : C'est ici qu'on indique clairement la solution de facilité. Pour ne pas se battre avec l'installation d'Apache et de PHP7, j'indique au Dockerfile de prendre comme base un conteneur ayant déjà PHP7, Apache et Debian configurés.

WORKDIR : Ici, on indique où vont s’exécuter les commandes qui vont suivre. Ce n'est pas pertinent dans mon cas, mais bon.

VOLUME : C'est une sorte de point de montage entre le conteneur et son hôte.

RUN : Simple : les commandes que nous allons exécuter à la création du conteneur. Ici, on va récupérer les sources de PluXml qui sont hébergées dans mon Gitlab perso, les extraire et les préparer. On va aussi activer le module Apache nécessaire au bon fonctionnement du CMS et installer le module PHP-GD, lui aussi obligatoire.

EXPOSE : C'est le port qui sera ouvert vers l'extérieur. On va taper sur le port 80 pour accéder au contenu du conteneur.

COPY : Commande permettant de copier des fichiers de votre ordinateur à l'intérieur du conteneur. ici, le script entrypoint.

CMD : La commande à exécuter une fois que tout est terminé.

Note : Oui, je sais, il y a des choses inutiles. C'est un exemple.

Entrypoint ?

Le script :
#!/bin/bash

if [ ! -e index.php ]; then
    unzip /usr/src/pluxml-latest.zip -d /var/www/html/
    mv /var/www/html/PluXml/* /var/www/html
    rm -rf /var/www/html/PluXml
    chown -R www-data: /var/www/html
fi

exec "$@"

Comprendre le entrypoint

On est face à un script bash tout simple mais il demande un peu d'explication quand même.
Nous voulons un conteneur mettant à disposition les sources de notre CMS adoré ET qui stockera les articles, commentaires, images, etc, loin de ce-dit conteneur. Sans ça, une fois le conteneur mort, les données mourront avec lui. Ces données, pour faire simple, seront dans le fameux VOLUME cité un peu plus haut.

Au sujet des sources, si notre Dockerfile s'amusait à les mettre directement dans /var/www/html, comme la norme le voudrait, elles disparaîtraient dans k8s.
Pourquoi ? Parce que ce VOLUME sera géré par k8s lui-même et sera vide :
- Dockerfile dépose les sources dans le conteneur
- k8s charge le conteneur
- k8s monte son persistentVolume dans /var/www/html
- Les sources du conteneur disparaissent. Échec.

Si vous regardez bien le Dockerfile et ses incroyablement nombreuses lignes de code : il déplace les sources dans /usr/src, bien au chaud, à l’abri du problème. À la création du conteneur, dans k8s, le script regardera s'il existe un fichier index.php (issu des sources du PluXml) et, le cas échéant, copiera les fichiers manquants dans /var/www/html qui sera un PersistentVolume dans k8s ! Et c'est bien ce que nous voulons !

La création de l'image

Pour construire une image Docker, placez-vous dans les répertoires où vous avez déposé les 2 fichiers détaillés précédemment et :
docker build -t pluxml-5.6 .
Vous allez voir des lignes s'afficher dans tous les sens : pas de panique, c'est normal. Une fois votre terminal calmé :
Successfully built d554d0753425
Successfully tagged pluxml-5.6:latest
Gagné !

Téléverser l'image dans un dépôt

On ne va pas s'attarder là-dessus. Sachez juste que pour que k8s se serve de l'image, il faut qu'elle soit téléchargeable. J'ai poussé mon image dans le Docker Hub, dans un dépôt public. Vous allez pouvoir jouer avec sans vous prendre la tête.

Préparer Kubernetes

Postulats de base :
- Vous avez configuré Rook.
- Vous avez dégagé ce qui concerne les pods Wordpress/Mysql.

Le deployment & co

On va reprendre le travail vu ces derniers jours et créer des YAML pour notre conteneur !
dada@k8smaster:~/pluxml$ cat pluxml.yaml 
apiVersion: v1
kind: Service
metadata:
  name: pluxml
  labels:
    app: pluxml
spec:
  ports:
  - port: 80
  selector:
    app: pluxml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: plx-pv-claim
  labels:
    app: pluxml
spec:
  storageClassName: rook-ceph-block
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 500Mi
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: pluxml
  labels:
    app: pluxml
spec:
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: pluxml
    spec:
      containers:
      - image: dadall/pluxml-5.6:latest
        imagePullPolicy: "Always"
        name: pluxml
        ports:
        - containerPort: 80
          name: pluxml
        volumeMounts:
        - name: pluxml-persistent-storage
          mountPath: /var/www/html
      volumes:
      - name: pluxml-persistent-storage
        persistentVolumeClaim:
          claimName: plx-pv-claim
Vous remarquez que je ne me suis pas foulé : c'est le YAML de Wordpress légèrement retravaillé. On y trouve le nom de mon image dans le Deployment et un Service pluxml.

L'ingress

dada@k8smaster:~/pluxml$ cat pluxml-ingress.yaml 
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
  name: pluxml-ingress
spec:
 backend:
   serviceName: pluxml
   servicePort: 80
Là aussi, simple : l'ingress qui s'attache à l'application pluxml.

Vous créez tout ça :
dada@k8smaster:~/pluxml$ kubectl create -f pluxml.yaml
dada@k8smaster:~/pluxml$ kubectl create -f pluxml-ingress.yaml
Si tout va bien, vous avez un pod PluXml qui vient d'apparaitre et qui est joignable !

Le pod :
dada@k8smaster:~/pluxml$ kubectl get pods --all-namespaces -o wide | grep plux
default            pluxml-686f7d486-7p5sq                                    1/1     Running     0          82m     10.244.2.164   k8snode2    <none>
Le service :
dada@k8smaster:~/pluxml$ kubectl describe svc pluxml
Name:              pluxml
Namespace:         default
Labels:            app=pluxml
Annotations:       <none>
Selector:          app=pluxml
Type:              ClusterIP
IP:                10.100.177.201
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.31:80
Session Affinity:  None
Events:            <none>
L'Ingress :
dada@k8smaster:~/pluxml$ kubectl describe ingress pluxml
Name:             pluxml-ingress
Namespace:        default
Address:         
Default backend:  pluxml:80 (10.244.1.31:80,10.244.2.164:80)
Rules:
  Host  Path  Backends
  ----  ----  --------
  *     *     pluxml:80 (10.244.1.31:80,10.244.2.164:80)
Annotations:
  kubernetes.io/ingress.class:  nginx
Events:                         <none>

Coucou PluXml !