Le Blog Utux

HTTP 200 GET /

J'ai tout migré sous aarch64 (ou presque)

Rédigé par uTux Aucun commentaire

Le blog vient de passer sous un sku cax11 chez Hetzner:

  • 2 vCPU Arm64 Ampere® Altra®.
  • 4 GB RAM.
  • 40 GB SSD.
  • 20 TB trafic.
  • NixOS vanilla.

Soit à peu près le double de la version x86 pour le même prix.

Et oui, j'ai bien mentionné NixOS vanilla, ou upstream. Contrairement à l'immense majorité des "bidules" en ARM qui nécessitent un OS spécialement modifié pour pouvoir booter, on a affaire ici à une machine virtuelle QEMU avec un firmware UEFI Tiano Core, qui permet de faire tourner n'importe quelle distribution Linux compilée en aarch64 ! L'installation a été réalisée avec nixos-infect. Voici le résultat d'un uname -a:

Linux prd-web-1 6.1.57 #1-NixOS SMP Tue Oct 10 20:00:46 UTC 2023 aarch64 GNU/Linux

Si j'en ai le courage, je m'attaquerai à la migration de mon serveur Yunohost actuellement en x86. Cela promet d'être laborieux puisque cela nécessite de copier tous mes e-mail, mais cela en vaut la peine.

OpenBSD + httpd: marrant, mais trop limité

Rédigé par uTux 2 commentaires

J'aime bien OpenBSD. Malgré sa réputation de vieux système Unix implacable sur la sécurité, il est d'une simplicité déconcertante, cohérent, et bien documenté. Un inconvénient tout de même était la difficulté d'installer les mises à jour (il fallait télécharger et décompresser soi-même les sets, ou booter sur un CDROM) mais ce point a enfin été résolu avec syspatch et sysupgrade. Mettre à jour OpenBSD est désormais aussi simple que n'importe quelle distribution Linux !

Sachez qu'il est possible d'installer OpenBSD chez hetzner, car l'hébergeur fournit un accès kvm (même sur les serveurs virtuels à bas prix) et permet de piocher dans une bibliothèque d'ISOs bootables. NixOS, Arch, FreeBSD, ... et OpenBSD. Un gros +1 pour Hetzner qui laisse cette liberté aux utilisateurs (et en plus ils ont un provider Terraform, si ça c'est pas qualitatif...).

J'ai donc installé un petit serveur OpenBSD afin d'héberger 1 ou 2 sites statiques pour un side project. Le but était surtout de m'amuser et utiliser httpd, le serveur web builtin de ce système d'exploitation.

Commençons par parler des points positifs. OpenBSD et httpd sont très simples à configurer, la lecture des manpage est presque suffisante en soit, alors que pour Linux je commence toujours par regarder des exemples, avant d'attaquer la documentation. Un client acme est également intégré dans le système, il n'y a rien besoin d'installer pour se générer des certificats Let's Encrypt. Et... c'est à peu près tout. Je pourrais dire que httpd est léger et sécurisé, mais quand il s'agit de servir des contenus statiques, c'est à peu près toujours le cas.

Passons maintenant aux points négatifs. Tout d'abord, il y a cette blague (pas drôle) des messages d'erreur en Comic Sans MS (et oui) dont on peut heureusement se débarrasser, au prix d'une petite bidouille. Mais ça ce n'est pas grand chose, car le plus gros problème avec httpd selon moi, c'est qu'il ne fait vraiment pas grand chose, à part servir des pages web. Par exemple il n'est pas possible de spécifier de Header set Cache-Control "max-age=604800, public", qui permet d'indiquer aux navigateurs qu'ils doivent mettre en cache les ressources statiques. Et ça se ressent fortement sur le temps de chargement de vos pages.

En fait, httpd a besoin d'être complété par relayd, un reverse-proxy beaucoup plus complet. Le problème est que sa configuration est un poil plus complexe, et que ça m'ennuie un peu d'avoir un reverse-proxy sur la même machine tout ça pour ajouter un simple header dans les réponses. Au final, je suis resté sur du 100% httpd, sans le cache, et mes sites ont du se contenter de performances honorables mais pas optimales.

Aujourd'hui l'expérience est terminée, et j'ai re migré mes sites statiques vers NixOS + Apache.

De Kubernetes à NixOS

Rédigé par uTux 4 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.

Aperçu de NixOS en desktop

Rédigé par uTux 4 commentaires

Il y a un peu plus de 2 ans j'ai parlé de NixOS, distribution Linux atypique dans le sens où sa configuration se fait de manière déclarative à un unique emplacement.

NixOS logo

Mon ordinateur pro et ma machine gaming sont sous Windows, j'utilise donc très souvent des machines virtuelles Linux pour pouvoir travailler. Habituellement j'utilise Virtualbox + Debian + Mate, mais j'ai décidé d'expérimenter NixOS. Alors oui je sais qu'une machine virtuelle n'est pas représentative d'un cas d'usage réel, mais ça permet de se faire une première idée.

Installation

J'ai installé NixOS avec la configuration suivante:

# Edit this configuration file to define what should be installed on
# your system.  Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running ‘nixos-help’).

{ config, pkgs, ... }:

{
  imports =
    [ # Include the results of the hardware scan.
      ./hardware-configuration.nix
    ];

  # Use the GRUB 2 boot loader.
  boot.loader.grub.enable = true;
  boot.loader.grub.version = 2;
  # Define on which hard drive you want to install Grub.
  boot.loader.grub.device = "/dev/sda"; # or "nodev" for efi only

  # Networking
  networking.hostName = "nixos"; # Define your hostname.
  networking.networkmanager.enable = true;

  # Select internationalisation properties.
  i18n = {
    consoleFont = "Lat2-Terminus16";
    consoleKeyMap = "fr";
    defaultLocale = "fr_FR.UTF-8";
  };

  # Set your time zone.
  time.timeZone = "Europe/Paris";

  # Repositories
  nixpkgs.config.allowUnfree = true;

  # List packages installed in system profile. To search, run:
  # $ nix search wget
  environment.systemPackages = with pkgs; [
    ansible
    dnsutils
    firefox-bin
    gimp
    git
    htop
    keepassxc
    libreoffice
    networkmanagerapplet
    parcellite
    p7zip
    sudo
    syncthing
    syncthing-gtk
    thunderbird-bin
    tree
    unzip
    vim
    vscode
    xarchiver
  ];

  # Enable CUPS to print documents.
  services.printing.enable = true;

  # Enable sound.
  sound.enable = true;
  hardware.pulseaudio.enable = true;

  # Mate
  services.xserver = {
    enable = true;
    layout = "fr";
    xkbOptions = "eurosign:e";
    desktopManager = {
      default = "mate";
      xterm.enable = false;
      mate.enable = true;
    };
  };

  # Docker
  virtualisation.docker.enable = true;
  
  # Define a user account. Don't forget to set a password with ‘passwd’.
  users.users.utux = {
    isNormalUser = true;
    extraGroups = [ "wheel" "networkmanager" "docker" ];
  };

  # Nix Garbage Collector
  nix.gc = {
    automatic = true;
    dates = "weekly";
    options = "--delete-older-than 30d";
  };

  # This value determines the NixOS release with which your system is to be
  # compatible, in order to avoid breaking some software such as database
  # servers. You should change this only after NixOS release notes say you
  # should.
  system.stateVersion = "19.09"; # Did you read the comment?
  system.autoUpgrade.enable = true;

}

Environnement desktop

NixOS Mate

La gestion centralisée de la configuration s'applique au système, mais pas au $HOME de l'utilisateur. Les raccourcis, les thèmes de bureau, les profils se gèrent "à la main", ce qui m'amène à penser que NixOS perd un peu d'intérêt en usage desktop. Cependant, ce point pourrait bientôt changer avec Home-manager.

Lors de la rédaction de cet article, la version de Mate est la 1.22.1 donc très récente, un bon point. Dans la liste des paquets installés, notez firefox-bin et thunderbird-bin. Couplés à l'activation du repo unfree, cela permet d'installer les versions à jour et upstream. Les paquets firefox et thunderbird sont des versions ESR dépourvues du branding de Mozilla, un peu comme Iceweasel et Icedove pour Debian il y a quelques années.

La version de Keepassx fournie par Nix (0.4.4) est trop vieille pour être utilisable avec le format .kdbx, j'ai donc du installer keepassxc à la place. Vscode est disponible lui aussi grâce au repo unfree.

Python...

Globalement je retrouve donc mon environnement et mes applications favorites, mais je dois quand même parler de Python. Sur Debian, j'utilise généralement pip pour installer une version récente de Ansible et Molecule, mais sur NixOS je n'ai simplement pas compris comment ça marche :/ Il y a pourtant une documentation dédiée à Python mais elle a tendance à ne pas situer correctement les contextes ou ne pas donner assez d'exemples. Donc pas de pip pour le moment, j'ai utilisé le paquet NixOS de Ansible.

Performances

En ce qui me concerne, l'utilisation du bureau Mate dans Virtualbox sur NixOS n'est pas très fluide :/ que ce soit l'ouverture d'un onglet, le déplacement d'un fenêtre, le lancement d'un logiciel, tout accuse de saccades et de lags. Debian s'en sort mieux sur ce point, à configuration presque identique (2 vspus, 2Go de ram, vboxsvga, 32Mo vram), mais cette dernière utilise Mate 1.20.4 et pas 1.22.1.

Lorsque j'ai fait des tests sur une machine peu puissante, j'ai remarqué que nixos-rebuild arrive à mettre à genoux le système et les autres VMs, à cause des écritures sur le disque. Et à propos du disque, il faut parler de l'utilisation du stockage. Par nature, NixOS garde plusieurs versions de la configuration (overlays) et des paquets installés, pensez à des snapshots, donc on se doute que l'espace utilisé est important, très important. On peut facilement consommer 30 Go après quelques semaines, ce qui m'amène au point suivant.

Penser au nettoyage (garbage collector)

Heureusement il existe le Garbage collector qu'il faut régulièrement lancer en root:

[utux@nixos:~]$ sudo nix-collect-garbage -d
[...]
deleting '/nix/store/39s914agmm045fv7l3lz81zcvw86m3vb-xsltml_2.1.2.zip.drv'
deleting '/nix/store/5vy6k04dhrwn0951z7dnpkqyxp3r7ws0-jasper-2.0.16-bin'
deleting '/nix/store/p5c18w2cksfxw748d4f8l31rlfk8z1vg-font-adobe-100dpi-1.0.3'
deleting '/nix/store/mny4fywzpgb2yi54a0vz97f5kxlb8932-unit-systemd-modules-load.service.drv'
deleting '/nix/store/xbl8wj6293nfw3vziwqd5xmhrk5gdq6b-rand_hc-0.1.0.tar.gz.drv'
deleting '/nix/store/trash'
deleting unused links...
note: currently hard linking saves -0.00 MiB
8134 store paths deleted, 11574.19 MiB freed

Dans l'exemple ci-dessus, le système a nettoyé pas loin de 11,6 Go de paquets inutiles ! Il est possible d'automatiser ce nettoyage.

Documentation

NixOS a un manuel très détaillé et très instructif. On trouve aussi beaucoup d'informations sur des fils reddit et github. Il est tout de même fréquent de devoir aller lire le code pour savoir comment se configurer un logiciel pour NixOS, ce qui est intimidant au début mais on s'habitue.

Conclusion

Hé hé, un test ou un aperçu d'une distribution est un exercice que je n'ai pas fait depuis longtemps. Je vous encourage à tester NixOS, sur serveur ou en desktop. Cette distribution n'est pas comme toutes les autres que vous connaissez et elle vous plaira particulièrement si vous faites du devops et que vous cherchez une solution pour versionner les configurations de vos bécanes.

Je dois tout de même avouer que l'utilisation desktop est un peu laborieuse, surtout à cause des mauvaises performances dans Virtualbox (qui font que je reviens souvent à ma Debian) mais aussi à l'absence de gestion centralisée des $HOME (pour cela je testerai Home-manager.).

Utiliser NixOS met un peu de piment dans ma vie de Linuxien trop habitué à la Debian family et à la Red Hat family :)

Notes: NixOS / efi installation

Rédigé par uTux Aucun commentaire

Notes sur l'installation de NixOS / efi:

Après avoir booté l'iso:

passwd
systemctl start sshd
ip addr

Connexion ssh root@ip pour faire l'installation plus aisément:

gdisk /dev/vda
n 1 [entrée] +100M EF00
n 2 [entrée] +2G 8200
n 3 [entrée] [entrée] 8300
w y
mkfs.vfat -F32 /dev/vda1
mkswap /dev/vda2
swapon /dev/vda2
mkfs.xfs /dev/vda3
mount /dev/vda3 /mnt
mkdir /mnt/boot
mount /dev/vda1 /mnt/boot
nixos-generate-config --root /mnt/
[Editer mnt/etc/nixos/configuration.nix]
nixos-install
reboot

Après avoir booté la distribution:

sudo nix-channel --add https://nixos.org/channels/nixos-17.09-small nixos
sudo nixos-rebuild switch --upgrade

Utilisé en machine virtuelle Bhyve. Xfs pour le lolz.

Et bien sûr on oublie pas la documentation :)

Fil RSS des articles de ce mot clé