• Billet d’un contact

    Adrien Dorsaz – Samedi, 26 Août - 11:50 - Samedi, 26 Août - 11:50

Just a reminder to give read access to backup postgresql user:

grant select on all tables in schema public to backup ;
alter default privileges in schema public grant select on tables to backup ;
grant select on all sequences in schema public to backup ;
alter default privileges in schema public grant select on sequences to backup ;
  • How to use your Movim blog as content provider for external domain

    Adrien Dorsaz – Mardi, 22 Août, 2017 - 14:27 - Jeudi, 24 Août, 2017 - 09:14


I've just been able to replace my WordPress blog with my Movim public blog on my home page. Following are steps I followed to have this working setup with Apache2 on Debian Stretch.

The hard part was to find a way to install a proxy on Movim URLs. Indeed, Movim use only one URL, like https://mov.adorsaz.ch/ to work: to decide if you want to view blog or chat for example, Movim add query strings to the URL (with HTTP GET options).

So the issue is that the Movim blog part is available to https://adorsaz.ch/?blog and such URL can't be directly used as proxy by Apache 2.

My server context

  • My own Movim pod is here: https://mov.adorsaz.ch
  • There, my public Movim blog is: https://mov.adorsaz.ch/?blog/adrien@adorsaz.ch
  • My main home page is there: https://adorsaz.ch

Show content from /?blog to /blog

First, in my Movim Apache 2 configuration I've enabled SSLProxyEngine (as all my virtual hosts use TLS) and RewriteEngine.

Then I added this RewriteRule to the Movim configuration:

RewriteRule    ^/blog(.*)$    /?blog$1    [QSA]

This rule redirect every one accessing https://mov.adorsaz.ch/blog to https://mov.adorsaz.ch/?blog . I had to use the [QSA] flag so Apache will append ?blog to the redirected URL.

(Note, that I used regular expression to copy all the chain (.*) to the query string arguments with $1)

Well, we don't want to redirect, but we want to keep user on /blog. So we need a Proxy rule to see content from /?blog directly inside /blog URL. To do so, I've simply modified the rule to:

RewriteRule    ^/blog(.*)$    /?blog$1    [QSA,P]

The [P] is for Proxy.

Set domain https://adorsaz.ch as a Proxy for https://mov.adorsaz.ch/blog/adrien@adorsaz.ch

Here, you simply need to say to Apache 2 to do a standard proxy between both URLs.

Inside the home page configuration, I enabled modules SSLEngineProxy and I've added this Proxy rule:

ProxyPass / https://mov.adorsaz.ch/blog/adrien%40adorsaz.ch/
ProxyPassReverse / https://mov.adorsaz.ch/blog/adrien%40adorsaz.ch/

Note that I've translated the @ to its URL encoded equivalent %40. The ProxyPassReverse instruction is not mandatory, it updates the Location HTTP header in the server responses.

Now, when a user read my blog, the content follow this path before coming to your browser:

https://mov.adorsaz.ch/?blog/adrien@adorsaz.ch (real Movim URLs)
↳ https://mov.adorsaz.ch/blog/adrien@adorsaz.ch (Movim URLs redirected by first step)
↳ https://adorsaz.ch/ (homepage URLs as seen by every one)

Although, they'll have some error in browser console, because cross domain requests are blocked by default. To allow fetching resources from the Movim pod domain through the homepage domain, I had to update the Movim configuration to add this rule:

Header set Access-Control-Allow-Origin "https://adorsaz.ch"

Rewrite HTML content to update blog URL

Now, users see the Movim blog on my home page, but all links inside the page targets to mov.adorsaz.ch instead of adorsaz.ch. To improve this, we can say to Apache 2 to update the content before sending it to real user.

Although, be careful, we only want to update the URLs which begins with mov.adorsaz.ch/?blog/adrien@adorsaz.ch/ as that's the only part of Movim that is behind the proxy. Indeed, all images, cache content, CSS and JavaScript sources have to be well reached from the real Movim address.

Such use case is well known on Apache 2 side as it's often needed when we set a Proxy. The substitute module documentation describes it well and even explain what's the difference between ProxyPass, ProxyPassReverse and Substitute.

To do that, I had to:

  • Enable the mod_substitute Apache 2 module with a2enmod substitute
  • Disable compression on Movim and my home page, otherwise the content can't be read and replaced by Apache2 with SetEnv no-gzip 1
  • Create a Substitute rule to update URLs.

So I added these lines to my homepage configuration:

SetEnv no-gzip 1
SSLCompression on
AddOutputFilterByType SUBSTITUTE  text/html
Substitute 's|href\s*=\s*([\'"])https://mov.adorsaz.ch/\?blog/adrien@adorsaz.ch|href=$1https://adorsaz.ch|i'

First two lines were also added to the Movim configuration.

Note, that I've enabled TLS compression to keep advantage of compression on the TLS layer as all my sites are TLS enabled. So Apache2 Proxy can replace the content easily and my clients still receive compressed datas.


Extra step: redirect every one using /?blog to /blog

Please note, that after some tests, I've seen some issues on Movim when I enabled this configuration. I think I've missed some point, so I let it here as reference, but I advise you to not use it !

This step is not necessary, but I wanted that my users see simpler URLs when they use Movim.

You can't do directly a rewrite from /?blog to /blog, because it will do an infinity loop when you server try to display /blog due to the first step.

To distinguish real users from my server, I use a rewrite condition to do the rewrite only for non-local clients. To do so, I've simplified my life by adding this line to my /etc/hosts file: mov.adorsaz.ch

Then, I've added to the Apache2 Movim configuration:

RewriteCond    %{REMOTE_ADDR}    !^127\.0\.0\.1$
RewriteCond    %{QUERY_STRING}    ^blog(.*)$ 
RewriteRule    ^/$    /blog%1    [QSD,R]

First two lines are rules to only apply the rewrite for external user wanting to access https://adorsaz.ch/?blog. In that case, Apache2 have to remove all the query string options ([QSD]) and then redirect (R) user to /blog (%1 correspond to the regexp group found inside the above RewriteCond rule).

Current adorsaz.ch Apache2 configurations

For Movim pod:

# Movim pod mov.adorsaz.ch
<VirtualHost *:443>
        SSLEngine on

        ServerName mov.adorsaz.ch

        DocumentRoot /srv/var/www/movim/

        # Movim daemon link
        ProxyPass /ws/ ws://localhost:8081/

    # Return uncompressed content and use TLS compression
        SetEnv no-gzip 1
        SSLCompression on

    # Rewrite URLs
        SSLProxyEngine On
        RewriteEngine On

        RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
        RewriteCond %{QUERY_STRING} ^(admin|blog|feed|login)(.*)$
        RewriteRule ^/$ /%1%2 [QSD,R]

    # Allow to read pages without needing to use query string arguments
        RewriteRule ^/(admin|blog|feed|login|help)(.*)$ /?$1$2 [QSA,P]

        <Directory /srv/var/www/movim>
                Require all granted

        # Add Access-Control to allow my home page to use the Movim pod ressources
                Header set Access-Control-Allow-Origin "https://adorsaz.ch"

                Options -Indexes
                AddType application/x-web-app-manifest json .webapp

                RewriteEngine On
                RewriteBase /

        <Directory /srv/srv/var/www/movim/config>
                Require all denied

        <FilesMatch \.php$>
                SetHandler "proxy:unix:/var/run/php/php7.0-fpm-movim.sock|fcgi://"

        CustomLog       "/var/log/apache2/mov-access.log" combined
        ErrorLog        "/var/log/apache2/mov-error.log"

Note that my regular expressions contains more than just the blog part, to have pretty URLs also for other Movim features.

For my homepage:

# Homepage adorsaz.ch
<VirtualHost *:443>
        SSLEngine on

        ServerName adorsaz.ch
        ServerAlias www.adorsaz.ch

        DocumentRoot /srv/var/www/movim

        # Rewrite content URLs
        SetEnv no-gzip 1
        SSLCompression on
        AddOutputFilterByType SUBSTITUTE  text/html
        Substitute 's|href\s*=\s*([\'"])https://mov.adorsaz.ch/\?blog/adrien@adorsaz.ch|href=$1https://adorsaz.ch|i'

        # Fetch the root directory from my blog on mov.adorsaz.ch
        SSLProxyEngine On
        ProxyPass / https://mov.adorsaz.ch/blog/adrien@adorsaz.ch/
        ProxyPassReverse / https://mov.adorsaz.ch

        CustomLog       "/var/log/apache2/www-access.log" combined
        ErrorLog        "/var/log/apache2/www-error.log"
  • 6 Commentaires

  • 23 Août, 2017 mulles

  • 23 Août, 2017 mulles

    thx a lot for sharing, I will migrate as well.

  • 23 Août, 2017 Adrien Dorsaz

    You are welcome :) Note that it seems the extra step seems to disturb the system, maybe you shouldn't do it for every links. Now, I'm using it only for login, admin,… pages. Also, every links on my home page points to the mov.adorsaz.ch domain. So, that's not really all blog on adorsaz.ch, but only the blog homepage. To fix it, we should ask Apache to dynamically rewrites some URLs in the content delivered. It should be tricky too, because of the query string arguments. Maybe the next step ?

  • 23 Août, 2017 Timothée Jaussoin

  • 24 Août, 2017 Adrien Dorsaz

    Well, that was not so hard, I've updated the blog to add the rewrite content part, to add a warning for the extra step which make Movim a little bit wired and to add the use of Access-Control-Allow-Origin header.

  • 28 Août athetize

  • Billet d’un contact

    Adrien Dorsaz – Lundi, 21 Août, 2017 - 12:18

Une approche à dimension humaine sur la liste de ses tâches à faire.
Il faudrait que je fasse ce genre de plan pour les contributions à l'open-source.
Seulement mon temps libre est très limité et du coup ça risque d'être une seule petite tâche par jour.
  • Adrien Dorsaz – Vendredi, 18 Août, 2017 - 08:05

    LinuxFR m'a fait découvrir Zeste de Savoir ou ZdS il y a quelques temps.
    On y retrouve l'esprit communautaire du feu Site du Zéro ou SdZ :
    actualités et tutoriels crées par la communauté :)

  • Zeste de Savoir

    Zeste de Savoir est un site de partage de connaissances sur lequel vous trouverez des tutoriels de tous niveaux, des articles et des forums d’entraide animés par et pour la communauté.

  • 3 Commentaires

  • 18 Août, 2017 Adrien Dorsaz

    Je suis en train de lire un article sur les « promesses » de JavaScript: les callbacks m'avaient déjà bien tordu l'esprit, eh bien ça recommence, mais j'ai l'impression que je pourrai faire des choses plus élégantes :) https://zestedesavoir.com/tutoriels/446/les-promesses-en-javascript/

  • 18 Août, 2017 Adrien Dorsaz

    Mmh, pour les promesses, Mozilla Developer Network est un peu plus explicite et complet: https://developer.mozilla.org/fr/docs/Web/JavaScript/Guide/Utiliser_les_promesses

  • 18 Août, 2017 Adrien Dorsaz

    Ok, si mes tests sont justes, la syntaxe des promesse est vraiment beaucoup plus élégante et intuitive que celle des callbacks. Pour avoir une bonne idée, je suis en train de modifier un gros projet (exchangecalendar) et de bien le simplifier 🤗

  • Mise à jour de Debian 8 à Debian 9 : expérience réussie !

    Adrien Dorsaz – Vendredi, 11 Août, 2017 - 15:37 - Vendredi, 11 Août, 2017 - 15:38

La mise à jour de mon serveur de Debian Jessie à Debian Stretch s'est plutôt bien déroulée !

J'ai eu la bonne surprise que certains services critiques ont passé facilement la mise à jour: leur version "Jessie Backports" et Stretch était quasi identique, ce qui m'a permis de m'éviter de devoir replonger dans leur configuration.

Je pense notamment à exim4 qui a une configuration assez complexe à mettre en place et qui gère mes emails. Systemd, le noyau et les outils BTRFS également ont profité des backports pour migrer en douceur ♥

Mon serveur XMPP, ejabberd, par contre n'a pas eu cette chance: bien que Jessie backports et Stretch fournissent la même version (16.09), je ne pouvais plus me connecter aux services avec mon certificat ECC (au lieu d'utiliser des clés RSA, j'utilisais des clés ECDSA). La cause est que la version d'OpenSSL n'était pas identique sur les deux configurations et ejabberd n'était donc plus capable de faire des connexions sécurisées correctement.

Heureusement, grâce aux développements open-source effectués par processone, j'ai découvert que ce problème avait déjà été corrigé au printemps dans les versions récentes d'ejabberd. Du coup, j'ai pu ouvrir un bug chez Debian, et j'ai même pu proposer un patch de correction :)

La mise à jour n'est pas disponible pour l'instant, elle est en attente de validation par l'équipe de gestion des mises à jour de Stretch. Donc, attendez encore un peu avant de migrer si vous utiliser des certificats ECC avec ejabberd !

Ah, j'ai eu un autre soucis avec la mise à jour récente d'OpenSSL, l'option ssl_protocols = !SSLv2 n'était plus reconnue. Je l'ai enlevée et ça a fonctionné à nouveau ensuite.

Avec cette mise à jour, j'en ai profité pour tester Fail2ban avec nftables (le remplaçant d'iptables) et pour faire passer la plupart de mes services à PHP 7.0 (Nextcloud, Movim, FreshRSS, PrivateBin). Wordpress (ou un de ses plugins) n'a pas trop aimé le passage à PHP 7.0, je l'ai donc laissé en PHP 5.6 (merci à PHP-FPM qui me permet de faire cohabiter différentes versions de PHP avec Apache2 !).

D'ailleurs, comme Movim (avec ejabberd) fonctionne particulièrement bien, je pense que je vais abandonner mon installation de WordPress, ce sera plus simple 😎

  • 1 Commentaires

  • 23 Août, 2017 Adrien Dorsaz

    Tiens, je viens de tomber sur des notes intéressantes d'un autre utilisateur: https://www.earth.li/~noodles/blog/2017/08/notes-on-stretch.html

  • Quand la communauté open-source m'ouvre les yeux sur la complexité de la gestion de l'heure dans le monde: le temps est simultanément de UTC -12h à UTC +14h dans le globe!

    Adrien Dorsaz – Mardi, 8 Août, 2017 - 06:35

Cette problématique me rappelle d'ailleurs avoir lu un article l'année dernière qui disait que la gestion des dates et du temps en informatique est un enfer. Sur le coup, je n'avais pas réagi à quel point c'est réellement un enfer, mais là, rien que la question des fuseaux horaire est déjà complexe !

  • 1 Commentaires

  • 8 Août, 2017 Adrien Dorsaz

    Ah j'ai retrouvé le lien du second article "Les mauvaises croyances des développeurs à propos du temps." : http://FalsehoodsAboutTime.com

  • Billet d’un contact

    Adrien Dorsaz – Lundi, 7 Août, 2017 - 06:23

Informations très intéressantes sur la gestion des sauvegardes de million de base de données chez OVH. Utilisation d'outils statistiques, de fonctions de répartitions, de dump SQL, de backups spéicifiques aux SGBD et d'ajout de RAM à la volée. Ce projet a dû être un challenge super intéressant pour leurs ingénieurs ! Merci pour le partage des grandes lignes !
  • Le taguage des fichiers commence à être pris en compte dans Nautilus

    Adrien Dorsaz – Jeudi, 27 Juillet, 2017 - 07:23 - Jeudi, 27 Juillet, 2017 - 08:35

Les développeurs GNOME travaillent à ajouter le support des tags dans leur gestionnaire de fichiers Nautilus (sobrement traduit "Fichiers").

Durant le développement, ils se rendent compte que les tags sont une organisation de fichiers à l'opposé de la structure traditionnelle par dossier. Plutôt que de proposer une interface compliquée à intégrer dans l'application à cause de ces natures différentes, ils ont fait le choix très judicieux de restreindre l'utilisation des tags au marquage de fichiers comme « favori ».

C'est une idée très intéressante, car ainsi Nautilus continue d'être une très bonne interface pour une structure de dossier tout en étant capable de profiter des tags pour certaines actions précises à mettre en lumière clairement.

En effet, l'avantage des tags est qu'ils sont directement insérés dans les fichiers et justement le fait d'être favoris est un attribut d'un fichier et non pas d'une structure de dossier.

À voir la vidéo de présentation des favoris, j'ai l'impression que l'équipe a trouvé une intéressante solution à leur problème de création non-intuitive des signets: la colonne "Favoris" est facilement utilisable et l'action du clique est claire directement sans avoir besoin d'animation compliquée qui indique que le signet a été crée dans la barre de gauche.

En y réfléchissant, une autre fonctionnalité intéressante serait d'avoir une colonne "note" qui ajouterai un tag standard pour définir une note de 1 à 5 sur les fichiers. Comme ça, on pourrait noter nos photos, vidéos, musiques directement dans Nautilus. Ensuite, les différentes applications spécialisées pourrait utiliser ces informations ou Nautilus pourrait ajouter un critère de recherche du style "Fichiers dont la note est plus de 3".

  • Tags in Nautilus

    As I mentioned in my last blog post, I spent the last weeks working on tags. Though, just to be clear from the beginning, general tags will probably not make it into the next versions of Nautilus. …

  • 1 Commentaires

  • 27 Juillet, 2017 Timothée Jaussoin