• Mmmhh, pour assurer leurs services pour les noms de domaine tunisien, OVH a du rapattrier en France la gestion des domaines enregistrés chez eux...

    Adrien Dorsaz – Vendredi, 6 Octobre, 2017 - 06:10 - Vendredi, 6 Octobre, 2017 - 06:11

Je comprend tout à fait leur action, ils ont décidé de fournir un service correctement avant de respecter leurs contrats, mais je me pose quand même une question: pourquoi avoir louer les 2 machines tunisiennes chez le même hébergeur ?

Il me semblait que dans les principes d'haute disponibilité, il fallait tout doubler, comme avoir 2 machines dans 2 lieus géographiques différents et chez 2 hébergeurs différents.

  • Billet d’un contact

    Adrien Dorsaz – Samedi, 26 Août, 2017 - 10:50 - Samedi, 26 Août, 2017 - 10: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 - 13:27 - Jeudi, 24 Août, 2017 - 08: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"
  • Billet d’un contact

    Adrien Dorsaz – Lundi, 21 Août, 2017 - 11: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 - 07: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é.

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

    Adrien Dorsaz – Vendredi, 11 Août, 2017 - 14:37 - Vendredi, 11 Août, 2017 - 14: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 😎