Le Blog Utux

HTTP 200 GET /

De Kubernetes à NixOS

Rédigé par uTux 2 commentaires

Il y a un an et demi, j'annonçais avoir migré mon blog sur Kubernetes (K3s). Bien que je sois globalement satisfait du résultat et que cela m'a permis de beaucoup apprendre, je rencontre tout de même des désagréments :

  • Kubernetes, c'est lourd. Comptez 1 GB de RAM à vide. Pour être à l'aise, j'ai du prendre un VPS avec 4GB de RAM, là où 2 suffiraient largement sans Kubernetes.
  • Absence de support d'IPv6. En 2022 c'est franchement difficile à justifier.
  • La gestion des Ingress est complexe. J'utilise Traefik mais c'est compliqué, il m'a fallu quasiment 2 jours pour faire fonctionner les certificats ACME, et les montées de version ne se passent pas toujours très bien.
  • Comme prévu, les mises jour à demandent un peu plus d'efforts car les composants ne sont pas gérés par la distribution. Il faut donc:
    • Mettre K3s à jour régulièrement.
    • Reconstruire et livrer les images même si l'application n'a pas changé, juste pour être sûr de ne pas trimbaler de failles de sécurité dans les librairies.
    • Mettre à jour Traefik régulièrement.

Bref, même si je trouve que Kubernetes est une super solution qui a mis en valeur les containers et l'écosystème Linux, c'est clairement overkill pour moi et je souhaite me simplifier la vie. Et si au passage je peux me former à de nouvelles technos, c'est un plus.

La solution de facilité aurait été d'installer Debian et de coder quelques roles Ansible mais l'inconvénient est que je n'apprendrais rien de nouveau. Je suis donc parti sur NixOS. C'est une distribution où la configuration s'effectue de manière déclarative via le langage Nix, avec gestion des états et possibilité de rollback.

En effet lorsque vous gérez votre distribution Linux avec Ansible, Puppet ou Salt, vous pouvez déployer une configuration et des applications, en revanche le retour en arrière n'est pas géré. Par exemple si vous avez déployé Apache et que vous voulez changer pour Nginx, c'est à vous de coder la manière dont Ansible va désinstaller Apache, sinon il sera toujours présent. Avec NixOS, si vous retirez toute référence à httpd dans votre configuration, il ne sera plus du tout présent à la prochaine génération du système. C'est un fonctionnement atomic et stateful.

Pour l'installation, j'ai utilisé nixos-infect, un script à lancer sur la plupart des distributions Linux afin de les remplacer par NixOS. Associé à un cloud-init, il permet de faire le déploiement via Terraform de manière complètement automatique, ce qui est vraiment cool il faut le dire. Et pour les gens qui préfèrent une installation à la main, sachez que Hetzner proposer une ISO NixOS et un accès console distante même pour les VPS, c'est donc totalement possible :)

Pour la partie hébergement web, voici mon fichier de configuration /etc/nixos/web.nix :

{ config, lib, pkgs,  ...}:

let
  defaultVirtualHost = {
    documentRoot = "/var/www/html/blank";
    addSSL = true;
    forceSSL = false;
    sslServerKey = "/var/www/ssl/snakeoil.key";
    sslServerCert = "/var/www/ssl/snakeoil.pem";
    locations."/" = {
      index = "index.html";
    };
  };
  makeVirtualHost = webroot:
    { documentRoot = "${webroot}";
      forceSSL = true;
      enableACME = true;
      locations."/" = {
        index = "index.php";
      };
      extraConfig = ''
        <Directory "${webroot}">
          AllowOverride All
        </Directory>
      '';
    };
in {
  security = {
    acme = {
      email = "hostmaster@example.org";
      acceptTerms = true;
    };
  };
  services = {
    httpd = {
      enable = true;
      mpm = "prefork";
      adminAddr = "hostmaster@example.org";
      enablePHP = true;
      phpPackage = pkgs.php80;
      phpOptions = "display_errors = off";
      extraConfig = ''
        SetOutputFilter DEFLATE
        ServerSignature Off
        ServerTokens prod
        <FilesMatch ".(ico|pdf|jpg|jpeg|JPEG|png|gif|js|css)$">
          Header set Cache-Control "max-age=3600, public"
        </FilesMatch>
      '';
      extraModules = [
        "deflate"
      ];
      virtualHosts =
        {"_default_" = defaultVirtualHost;
         "utux.fr"   = (makeVirtualHost "/var/www/html/utux.fr");
        };
    };
  };
}

Explications : j'ai d'autres vhosts non mentionnés ici, et à chaque fois leur configuration est identique. Pour éviter d'avoir à répéter du code, j'utilise let (permet de définir des variables et des fonctions) ainsi que in (pour les appliquer). Je ne connais pas de moyen plus propre de faire des loop pour le moment, car c'est le but. Étant donné que j'utilise PluXml, il ne faut pas oublier le AllowOverride All qui permet aux .htaccess de fonctionner, sinon les fichiers XML qui contiennent les data deviennent accessible, ce qui fait fuiter pas mal d'infos sensibles.

Pour le moment, ça marche plutôt bien. Le serveur consomme 119 Mo de RAM, soit quasiment 10x moins que Kubernetes :) Et en prime le support de l'IPv6 est revenu.

En conclusion, je suis content de pouvoir enfin tester NixOS en production. Bien que je ne sois pas encore familier avec le langage Nix, et que je le trouve bien trop compliqué par rapport à un bon vieux Ansible, j'estime que c'est l'avenir de Linux sur serveur. Les distributions devront être atomiques, et leur configuration centralisée, versionnée et reproductible. J'espère que ceci est le début d'une aventure positive.

Pourquoi Pluxml ?

Rédigé par uTux 19 commentaires

Mon blog est "propulsé" par Pluxml, ce n'est pas une surprise. Le choix de ce moteur de blog a été difficile car il en existe de très nombreux avec leurs avantages et inconvénients.

Je suis "un vieux" du net, j'ai connu dotclear1 donc pour moi un CMS c'est principalement un bidule en PHP qui offre une interface d'administration dans laquelle je rédige mes articles et génère des aperçus avant de publier. J'ai donc rapidement écarté tous les moteurs de blog "statiques", c'est à dire ceux qui "compilent" un fichier d'entrée au format markdown vers une page html car même si j'aime beaucoup l'idée (un simple serveur web sans dépendance suffit pour publier les pages) ce n'est pas ce que je recherche.

J'ai regardé du côté de Ghost pour le look très attirant et le dynamisme du projet. Malheureusement, c'est du Node. Ce langage est probablement super du point de vue développeur mais du point de vue sysadmin c'est une horreur. Il y a des tonnes de dépendances à installer et à maintenir et il faut toujours une version bien précise car la compatibilité n'est pas assurée. Donc on compile, on lance des scripts qui compilent les dépendances et on prie pour que ça ne pète pas. Ajoutons aussi à cela le fait que Ghost ne prend pas en charge les commentaires et qu'il y a un consensus sur le fait d'utiliser Disqus pour ça... or moi je n'ai pas envie, je ne veux pas sous-traiter les commentaires et je ne veux pas forcer les gens à s'inscrire pour pouvoir discuter !

J'ai ensuite essayé Wordpress mais je l'ai rapidement écarté car c'est un CMS qui a tellement de facettes qu'on ne sait plus vraiment à quoi il sert, de plus sa complexité (au niveau code) le rend difficile à bidouiller. Dotclear a aussi eu droit à un essai. Je ne l'ai pas trouvé déplaisant malheureusement je ne suis pas très fan du thème par défaut et n'ai pas envie d'en télécharger sur le web, c'est trop risqué et peu original.

Donc ce bon vieux Pluxml s'est finalement imposé. Le thème de base est simple, utilise du responsive design, et est facile à modifier. L'interface d'administration est classique et je suis complètement familier avec. Bien sûr Pluxml n'est pas parfait, il a plusieurs défauts :

  • Pas de support markdown
  • Ps d'éditeur wysiwyg
  • Pas de moteur de recherche
  • Trop dépendant envers Apache
  • Pas d'antispam dans les commentaires

Si vous connaissez des moteurs de blogs alternatifs à Pluxml, qui ne sont pas en Node, qui gèrent les commentaires, ça m'intéresse car je suis toujours à la recherche de nouvelles aventures !

Le Premier article !

Rédigé par uTux 17 commentaires

Et oui, ceci est le premier article du blog.

Qui suis-je ? Certainement un fou pour lancer un blog en 2016, à l'heure où tout le monde ne jure que par les réseaux sociaux à travers le web.

Oui les blogs disparaissent mais ils restent un excellent moyen de publication non formaté adapté à des écrits subjectifs. Et c'est précisément ce point qui m'intéresse car il m'arrive souvent d'avoir des choses à dire ou à partager et les quelques rares réseaux sociaux que je fréquente ne me conviennent pas.

Gérer l'hébergement est une chose amusante pour moi. Le blog est propulsé par Ubuntu (Debian Jessie) + Pluxml + Nginx et hébergé sur un VPS chez Leaseweb. L'accès est possible en HTTP ou en HTTPS signé par Let's Encrypt que je trouve vraiment très intéressant et dont je ne manquerai pas de parler.

EDIT : Désormais c'est Scaleway.

Vous ne trouverez pas de publicité ni d'articles sponsorisés car ce blog n'a pas vocation à rapporter de l'argent.

N'hésitez pas à vous abonner au flux RSS (oui ça aussi c'est obsolète mais tellement pratique) pour suivre mes aventures.

Fil RSS des articles de ce mot clé