cron pour nextcloud en mode container

Plutôt simple quand on sait ce qu’on veut

*/10 * * * * . /etc/profile && /usr/bin/docker container exec –user www-data -w /var/www/html ap002_app_1 /usr/local/bin/php -f /var/www/html/cron.php

J’ai cependant perdu pas mal de temps à cause du ‘-it’ dans la commande exec qui ne fonctionne pas dans cron.

NAS v2

Lors de la construction de mon premier NAS, je n’ai pas pris de note. J’ai travaillé frénétiquement, ajoutant brique par brique jusqu’à avoir quelque chose de fonctionnel.

Erreur !!

Après un an de bons et loyaux services, je souhaiterais le refaire en changeant plusieurs petites choses.

Mon NAS v1 était basé sur une Debian 10 headless (pas d’écran/clavier). L’idée de base était de ne rien installer sur ce système hormis Docker (et Docker-Compose).
J’ai quand même dû installé quelques petits outils comme le client acme pour la gestion des certificat par lets-encrypt.

Le résultat était satisfaisant. j’ai pû faire tout ce que je voulais avec ce système. Toutefois, ce qui me manquait le plus c’est de pouvoir jouer avec Docker, tester des trucs, simuler la migration/mise à jour, voire jouer avec un rancher ou coreOS.

Leçon apprise:

  • ne pas débuter ce genre de projet sur une distro non stable
  • installer à la base un hyperviseur (Proxmox ?)

Bon bin, c’est parti. je refais tout !!

Du coup, à grand peine (à cause du choix discutable de buster/sid), j’ai fini par installer un virtualbox dans lequel, j’ai pu installer des VMs.
Ca c’est assez bien passé en suivant la doc suivante: https://zdingdin.medium.com/install-virtualbox-on-debian-10-buster-headless-server-8fa1649669a1

C’est un prérequis car, il me faut préparer la migration des données !

rendre une vm Virtual box accessible avec RDP :

$ VBoxManage modifyvm "Deb1" --vrdeaddress 0.0.0.0

Installation de docker
https://sqx-bki.fr/comment-installer-docker-sur-debian-10/

Installation de portainer:

$ sudo docker volume create portainer_data
$ sudo docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce


OCR

Cela fait des années (non, je ne plaisante pas) que je cherche à faire un petit bout de logiciel qui prend en entrée des PDF (en provenance directement d’un scanner… ce serait top) et qui les classe en fonction du contenu des PDF.

J’ai cherché plusieurs fois des solutions, mais à chaque fois, je tombais sur des lib qui utilisaient un service cloud pour faire l’OCR des PDF. Pas acceptable pour moi.

Et là hier soir, alors que je jouais avec nextcloud, je vois un pluggin OCR. Toujours curieux, je regarde un peu ce que cela implique. Je découvre alors qu’il utilise ‘tesseract.js’. WTF… un OCR en javascript !!

Il m’a pas fallut 10 minutes pour trouver l’équivalent en python (basé sur le binaire tesseract). 10 minutes de plus, et j’avais un container opérationnel capable de lire des PNG. Ensuite, j’ai un peu bricolé, et BIM… ouverture de PDF, extraction des images (JPG) et OCR sur les images.

Et dire que c’était aussi simple que ça !

Recipe

Dockerfile

FROM alpine
ENV HOSTNAME infra ENV PS1 "[\h] \w \$ " RUN apk add python3 && pip3 install --upgrade pip && pip3 install virtualenv

Lib python

apk add gcc
apk add make
apk add musl-dev
apk add python3-dev
apk add zlib-dev
apk add libjpeg
apk add jpeg-dev
pip install pytesseract
apk add tesseract-ocr
pip install PyPDF2

Paramétrage tesseract

wget https://github.com/tesseract-ocr/tessdata/raw/master/fra.traineddata
mkdir -p /usr/share/tessdata
mv fra.traineddata /usr/share/tessdata

Ouverture de PDF

pip install reportlab
wget https://raw.githubusercontent.com/ronanpaixao/PyPDFTK/master/pdf_images.py

Utilisation (lecture PNG)

import pytesseract
print(pytesseract.image_to_string(Image.open('test.png'), lang='fra'))

Utilisation (ouverture de pdf)

import PyPDF2
import pytesseract
import pdf_images
input1 = PyPDF2.PdfFileReader(open("test.pdf", "rb"))
page0 = input1.getPage(0)
pdf_images.extract_images(page0)
print(pytesseract.image_to_string(Image.open('IMG_0000.jpg'), lang='fra'))