[{"content":" Pourquoi construire un environnement IA local ? Depuis quelques mois, les assistants IA ne sont plus réservés aux plateformes cloud.\nEntre les modèles locaux pilotés par Ollama et les outils de développement augmentés comme Claude Code, il devient possible de construire un environnement de travail moderne, reproductible et parfaitement intégré à Nixos.\nLe problème, c’est que l’empilement technique devient rapidement fragile :\nune version de Node.js incompatible ; un npm global qui casse après une mise à jour ; des dépendances qui divergent d’une machine à l’autre ; des outils IA installés à moitié dans le système et à moitié dans le home utilisateur. C’est précisément là que NixOS change complètement l’expérience.\nAvec un simple flake.nix, il devient possible de décrire un environnement de développement complet, reproductible et portable.\nDans cet article, nous allons mettre en place :\nClient Ollama pour exécuter des modèles locaux ; Claude Code comme assistant de développement ; un shell Nix moderne compatible NixOS 25.11. Le principe : un environnement entièrement déclaratif et reproductif\nLa base 1 flake.nix Ce fichier permettra :\nd’installer automatiquement les bons paquets ; d’obtenir les mêmes versions sur toutes les machines ; d’éviter les conflits entre projets ; de reconstruire l’environnement en quelques secondes. C’est l’un des grands avantages de NixOS : l’environnement devient du code.\nLa structure du flake Voici une version compatible avec NixOS 25.11.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 { description = \u0026#34;Environnement Ollama + Claude Code\u0026#34;; inputs = { nixpkgs.url = \u0026#34;github:NixOS/nixpkgs/nixos-25.11\u0026#34;; flake-utils.url = \u0026#34;github:numtide/flake-utils\u0026#34;; }; outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; config.allowUnfree = true; }; in { devShells.default = pkgs.mkShell { packages = with pkgs; [ ollama nodejs_24 claude-code ]; shellHook = \u0026#39;\u0026#39; echo \u0026#34;🚀 Environnement Ollama + Claude Code\u0026#34; export OLLAMA_HOST=\u0026#34;http://localhost:11434\u0026#34; \u0026#39;\u0026#39;; }; } ); } Pourquoi utiliser nodejs_24 ? Avant NixOS 25.11, beaucoup de projets utilisaient encore :\n1 pkgs.nodePackages.npm Le problème est que tout le namespace nodePackages a été supprimé dans les versions récentes de nixpkgs.\nLa bonne pratique consiste désormais à utiliser directement une version explicite de Node.js :\n1 nodejs_24 Cela fournit automatiquement :\nnode npm npx sans dépendre des anciens wrappers nodePackages.\nPourquoi installer Claude Code via Nix ? Beaucoup de tutoriels recommandent encore :\n1 npm install -g @anthropic-ai/claude-code Techniquement, cela fonctionne, mais dans une logique NixOS, cette approche casse plusieurs principes importants :\nnpm va essayer d\u0026#39;écrire dans /nix/store l’installation n’est plus déclarative ; le binaire dépend du profil utilisateur ; les versions deviennent difficiles à reproduire ; les mises à jour peuvent casser silencieusement l’environnement. L’approche ici consiste donc à utiliser directement le paquet :\n1 claude-code Le paquet étant marqué unfree, il faut activer explicitement :\n1 config.allowUnfree = true; Démarrer l’environnement Une fois le fichier créé, il suffit d’exécuter :\n1 nix develop Le shell charge automatiquement :\nOllama ; Node.js ; Claude Code ; les variables d’environnement. Ollama étant déjà installé avec open-webui pour d\u0026#39;autres usages, il me reste simplement à lancer Claude Code :\n1 claude Pourquoi cette approche devient incontournable L’écosystème IA évolue extrêmement vite.\nLes dépendances changent constamment. Les versions de Node.js deviennent incompatibles. Les wrappers npm globaux cassent régulièrement.\nAvec NixOS, on verrouille complètement l’environnement.\nAller plus loin Une fois cette base fonctionnelle, plusieurs extensions deviennent intéressantes :\nintégrer direnv pour charger automatiquement le shell Ici il suffit d\u0026#39;ajouter un fichier flake.nix à la racine du projet :\n1 nix flake Autoriser le chargement automatique du flake :\n1 direnv allow Vous pouvez ajouter :\najouter CUDA pour l’accélération GPU (mais moi j\u0026#39;ai pas); empaqueter des modèles Ollama spécifiques ; construire des environnements totalement hermétiques par projet. Alexandre\n","date":"2026-05-18T00:00:00Z","permalink":"https://atlanticaweb.fr/p/2026/05/18/mettre-en-place-un-environnement-ia-local-avec-ollama-et-claude-code-sur-nixos/","title":"Mettre en place un environnement IA local avec Ollama et Claude Code sur NixOS"},{"content":" Introduction Dans un environnement Kubernetes, Ceph est souvent utilisé comme backend de stockage (RBD ou CephFS). Pourtant, lorsqu’un incident survient côté applications (latence, timeouts, pods bloqués), le stockage est fréquemment suspect… sans être correctement analysé.\nL’objectif de cet article est simple :\nidentifier les bonnes métriques Ceph comprendre leur signification opérationnelle savoir expliquer les impacts côté applications Kubernetes On s’appuie ici sur les bonnes pratiques issues du monitoring Prometheus et notamment les Golden Signals (latence, erreurs, saturation, trafic) :contentReference[oaicite:0]{index=0}.\n—\n1. Vue d’ensemble : raisonner en “Golden Signals” Ceph n’est pas un simple stockage : c’est un système distribué.\nLes 4 signaux à surveiller :\nSignal Ce que ça veut dire dans Ceph Impact Kubernetes Erreurs cluster en état dégradé pods bloqués / crash Latence IO lentes API lentes / timeouts Saturation disque plein scheduling impossible Trafic charge IO contention —\n2. Santé globale du cluster (LE KPI numéro 1) Metric clé :\nceph_health_status Interprétation :\n1 = OK != 1 = problème critique :contentReference[oaicite:1]{index=1} Graph recommandé :\nSingle stat + historique 1 ceph_health_status Pourquoi c’est pertinent :\nC’est l’indicateur synthétique du cluster Corrélé directement à l’expérience utilisateur Impact Kubernetes :\nHEALTH_WARN → dégradations progressives HEALTH_ERR → volumes indisponibles → pods KO —\n3. Saturation : capacité disque (le piège classique) Metrics :\nceph_cluster_total_bytes ceph_cluster_total_used_bytes :contentReference[oaicite:2]{index=2} Graph recommandé :\n1 100 * ceph_cluster_total_used_bytes / ceph_cluster_total_bytes (type: ligne avec projection)\nAjout critique : prédiction\n1 predict_linear(ceph_cluster_total_used_bytes[1d], 5*24*3600) Pourquoi c’est pertinent :\nAnticipation (pas juste observation) Détection des effets “runaway” (logs, snapshots, etc.) Impact Kubernetes :\nPVC provisioning FAIL Pods Pending CrashLoopBackOff si write impossible —\n4. Latence OSD : le vrai signal applicatif Metrics :\nceph_osd_commit_latency_ms ceph_osd_apply_latency_ms :contentReference[oaicite:3]{index=3} Graph recommandé :\nheatmap ou percentiles (P95/P99) 1 avg(ceph_osd_commit_latency_ms) Pourquoi c’est critique :\nreflète la vitesse réelle du stockage directement corrélé aux performances applicatives Lecture :\nstable + basse → OK spikes → contention ou disque lent Impact Kubernetes :\nDB lentes (Postgres, MySQL) APIs timeout queues qui explosent —\n5. Trafic : IOPS et throughput Metrics :\nceph_osd_op_r / ceph_osd_op_w ceph_osd_op_r_out_bytes / ceph_osd_op_w_out_bytes :contentReference[oaicite:4]{index=4} Graph recommandé :\n1 rate(ceph_osd_op_r[5m]) 1 rate(ceph_osd_op_w[5m]) Pourquoi c’est pertinent :\nPermet de comprendre qui consomme Détecte les spikes applicatifs Pattern classique :\ntrafic ↑ + latence ↑ = saturation trafic stable + latence ↑ = problème infra —\n6. OSD \u0026amp; résilience (impact invisible mais critique) Metrics :\nceph_osd_up ceph_osd_recovery_ops :contentReference[oaicite:5]{index=5} Graph recommandé :\nnombre d’OSD up/down recovery rate 1 rate(ceph_osd_recovery_ops[5m]) Pourquoi c’est critique :\nun OSD down déclenche du rebalancing le cluster devient plus lent pendant la reconstruction Impact Kubernetes :\nlatence globale ↑ performance instable risque accru si autre panne —\n7. CephFS : comprendre les métriques spécifiques CephFS ajoute une couche critique : le metadata server (MDS).\nMetric clé :\nceph_mds_request :contentReference[oaicite:6]{index=6} Graph recommandé :\nrequêtes MDS / seconde 1 rate(ceph_mds_request[5m]) Pourquoi c’est important :\nCephFS = metadata + data saturation MDS = filesystem lent même si OSD OK —\n8. MDS : le cœur de CephFS Rôle :\ngestion des inodes / metadata coordination accès fichiers Si le MDS tombe : → plus d’accès au filesystem :contentReference[oaicite:7]{index=7}\n—\nMetrics critiques :\nceph_mds_metadata disponibilité MDS nombre de MDS actifs 1 count(ceph_mds_metadata) —\nGraph recommandé :\nnombre de MDS actifs vs attendu Cas critique :\nMDS manquant 1 count(ceph_mds_metadata == 1) == 0 :contentReference[oaicite:8]{index=8}\n—\nPourquoi c’est critique :\nCephFS dépend du MDS pour TOUT même si les disques sont OK → FS inutilisable —\nImpact Kubernetes :\nvolumes montés mais bloqués pods en timeout IO erreurs NFS-like —\n9. Quorum MON : stabilité du cluster Metric :\nceph_mon_quorum_status :contentReference[oaicite:9]{index=9} Graph recommandé :\nnombre de MON en quorum Pourquoi c’est critique :\nperte de quorum = cluster non pilotable Impact Kubernetes :\nopérations bloquées provisioning impossible —\n10. Lecture globale : corréler les métriques Un bon exploitant ne regarde jamais une métrique seule.\nExemples de corrélation :\nSymptôme Analyse Latence ↑ + OSD recovery ↑ rebuild en cours Latence ↑ + trafic stable disque lent Saturation ↑ + trafic normal fuite stockage MDS OK + IO lentes OSD problème MDS KO + OSD OK CephFS HS —\n11. Traduire pour un client / applicatif Le rôle d’un responsable plateforme :\nNe pas dire :\n“le cluster est en HEALTH_WARN” Mais dire :\n“les écritures sont 3x plus lentes → impact DB” “le filesystem CephFS est indisponible → pods bloqués” “on atteindra 100% disque dans 4 jours” —\nConclusion Surveiller Ceph efficacement, ce n’est pas multiplier les dashboards.\nC’est :\ncomprendre les métriques structurantes raisonner en impact applicatif corréler les signaux Les métriques essentielles à retenir :\nSanté : ceph_health_status Capacité : ceph_cluster_total_used_bytes Latence : ceph_osd_commit_latency_ms Trafic : ceph_osd_op_* CephFS : ceph_mds_request Disponibilité : MDS / MON / OSD Un bon monitoring Ceph n’est pas technique.\nC’est un outil de traduction entre stockage et application.\n","date":"2026-03-19T12:02:31+01:00","permalink":"https://atlanticaweb.fr/p/2026/03/19/comprendre-les-m%C3%A9triques-cl%C3%A9s-dun-cluster-ceph-cephfs-mds-pour-lexploitation/","title":"Comprendre les métriques clés d’un cluster Ceph (CephFS \u0026 MDS) pour l’exploitation"},{"content":" Introduction La signature de commits Git est devenue une pratique essentielle pour garantir l\u0026#39;authenticité du code source. Avec NixOS et Home Manager, cette configuration devient déclarative, reproductible et élégante. Cet article détaille comment configurer Git avec la signature SSH ED25519, à la place de gpg, particulièrement adaptée aux forges auto-hébergées comme Forgejo ou Gitea. Github et gitlab intègre l\u0026#39;affichage du controle de signature.\nPourquoi signer ses commits ? La signature de commits offre plusieurs avantages :\nAuthenticité : garantit que c\u0026#39;est bien vous qui avez créé le commit Traçabilité : essentiel pour les projets sensibles ou collaboratifs Badge vérifié : sur Forgejo/Gitea, vos commits affichent un badge de vérification Avec SSH, vous réutilisez vos clés existantes sans la complexité de GPG. L\u0026#39;apport principal de GPG étant la durée de vie des clés et la révocation, à vous de mesurer votre besoins.\nA ce jour, je ne travail pas dans un contexte ou j\u0026#39;ai besoins des fonctionnalités de GPG, j\u0026#39;ai donc opté pour SSH, mais ce contexte pourrait changer dans un futur plus ou moins proche. Le changement pour GPG sera simple.\nConfiguration déclarative avec Home Manager Structure du module home-manager Le fichier git.nix configure Git de manière déclarative. Voici la configuration complète :\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 { config, pkgs, ... }: { home.file.\u0026#34;.ssh/allowed_signers\u0026#34;.text = \u0026#34;* ${builtins.readFile /home/alexandre/.ssh/id_ed25519-2025.pub}\u0026#34;; programs.git = { enable = true; settings = { # Configuration utilisateur user = { name = \u0026#34;Alexandre LUCAZEAU\u0026#34;; email = \u0026#34;lucazeau.alexandre@gmail.com\u0026#34;; signingkey = \u0026#34;~/.ssh/id_ed25519-2025.pub\u0026#34;; }; # Activation de la signature commit = { gpgsign = true; }; # Configuration SSH pour la signature gpg = { format = \u0026#34;ssh\u0026#34;; ssh.allowedSignersFile = \u0026#34;~/.ssh/allowed_signers\u0026#34;; }; # Autres paramètres utiles init = { defaultBranch = \u0026#34;main\u0026#34;; }; core = { pager = \u0026#34;delta\u0026#34;; }; }; }; } J\u0026#39;utilise delta comme pager à la place de less. Je le trouve plus lisible dans les diffs avec de la coloration et l\u0026#39;affichage des numéros de lignes.\nPoints clés de la configuration Fichier allowed_signers Le fichier ~/.ssh/allowed_signers est crucial pour la vérification locale des signatures :\n1 * ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... lucazeau.alexandre@gmail.com Home-Manager génère automatiquement ce fichier en lisant votre clé publique. Le format est simple : un motif (ici * pour tout email) suivi de la clé publique.\nActivation de la signature automatique Le paramètre commit.gpgsign = true signe automatiquement tous vos commits sans avoir à ajouter -S à chaque fois.\nFormat SSH au lieu de GPG L\u0026#39;option gpg.format = \u0026#34;ssh\u0026#34; indique à Git d\u0026#39;utiliser SSH au lieu du traditionnel GPG, simplifiant drastiquement la configuration.\nGénération de la clé SSH Si vous n\u0026#39;avez pas encore de clé ED25519 :\n1 2 3 4 5 6 # Générer une nouvelle clé ssh-keygen -t ed25519 -C \u0026#34;lucazeau.alexandre@gmail.com\u0026#34; \\ -f ~/.ssh/id_ed25519-2025 # Ajouter au ssh-agent ssh-add ~/.ssh/id_ed25519-2025 La clé publique se trouve dans ~/.ssh/id_ed25519-2025.pub.\nConfiguration sur Forgejo/Gitea Ajout de la clé de signature Connectez-vous à votre instance Forgejo Accédez à Paramètres → Clés SSH / GPG Dans la section Clés SSH, cliquez sur Ajouter une clé Important : cochez la case \u0026#34;Utiliser cette clé pour signer les commits\u0026#34; Collez le contenu de votre id_ed25519-2025.pub Donnez-lui un nom descriptif (ex: \u0026#34;NixOS Desktop 2025\u0026#34;) Vérification sur Forgejo 1 2 3 4 5 # Créer un commit signé git commit -m \u0026#34;test: vérification signature SSH\u0026#34; # Pousser vers Forgejo git push origin main Sur l\u0026#39;interface web de Forgejo, votre commit devrait maintenant afficher un badge Vérifié avec une coche verte.\nAlias Git pratiques La configuration inclut plusieurs alias qui améliorent le workflow :\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 alias = { # Commits rapides cim = \u0026#34;commit -m\u0026#34;; cima = \u0026#34;commit -am\u0026#34;; oups = \u0026#34;commit --amend --no-edit\u0026#34;; # Gestion des branches nb = \u0026#34;checkout -b\u0026#34;; bd = \u0026#34;branch -d\u0026#34;; # Push sécurisé pushfl = \u0026#34;push --force-with-lease\u0026#34;; # Statut compact st = \u0026#34;status -sb\u0026#34;; }; L\u0026#39;alias oups est particulièrement utile pour amender le dernier commit signé sans éditer le message.\nIntégration avec Delta La configuration utilise Delta comme pager pour des diffs plus lisibles :\n1 2 3 4 5 6 7 8 9 10 11 12 core = { pager = \u0026#34;delta\u0026#34;; }; interactive = { diffFilter = \u0026#34;delta --color-only --features=interactive\u0026#34;; }; delta = { navigate = true; line-numbers = true; }; Delta nécessite d\u0026#39;être installé dans votre configuration NixOS :\n1 2 3 home.packages = with pkgs; [ delta ]; Vérification locale des signatures Pour vérifier les signatures de commits localement :\n1 2 3 4 5 # Voir les signatures dans le log git log --show-signature # Vérifier un commit spécifique git verify-commit HEAD La sortie devrait afficher :\nGood \u0026#34;git\u0026#34; signature for lucazeau.alexandre@gmail.com with ED25519 key SHA256:... Debugging et problèmes courants Erreur \u0026#34;gpg failed to sign the data\u0026#34; Vérifiez que :\nLe fichier allowed_signers existe et contient votre clé Le chemin vers signingkey est correct La clé privée est chargée dans le ssh-agent 1 2 3 4 5 # Vérifier le ssh-agent ssh-add -l # Recharger la clé si nécessaire ssh-add ~/.ssh/id_ed25519-2025 La signature n\u0026#39;apparaît pas sur Forgejo Vérifiez que la clé SSH sur Forgejo a bien la case \u0026#34;signature\u0026#34; cochée L\u0026#39;email dans user.email doit correspondre à un email vérifié sur Forgejo Assurez-vous que la clé publique est exactement la même Chemin relatif vs absolu La configuration utilise ~/.ssh/... plutôt que des chemins absolus. Home Manager résout automatiquement ~ vers votre répertoire home.\nAvantages de l\u0026#39;approche déclarative Avec NixOS et Home-Manager :\nReproductibilité : même configuration sur toutes vos machines Versionnage : votre config Git est dans votre dépôt dotfiles Atomicité : activation/rollback instantané avec home-manager switch Documentation : la config est auto-documentée en Nix Migration depuis GPG Si vous utilisiez GPG auparavant, la migration est simple :\n1 2 3 4 5 6 7 8 9 # Commentez l\u0026#39;ancienne config GPG #signing.key = \u0026#34;3C8ADB07A8217BD3\u0026#34;; #signing.signByDefault = false; # La nouvelle config SSH prend le relais gpg = { format = \u0026#34;ssh\u0026#34;; ssh.allowedSignersFile = \u0026#34;~/.ssh/allowed_signers\u0026#34;; }; Aucun impact sur vos anciens commits signés avec GPG, ils restent valides.\nConclusion La signature SSH de commits avec NixOS offre le meilleur des deux mondes : la simplicité de SSH et la puissance de la configuration déclarative.\nPour aller plus loin :\nActivez la signature obligatoire sur vos dépôts Forgejo Configurez des hooks pre-commit pour vérifier les signatures Explorez git config --global tag.gpgSign true pour signer aussi les tags Ressources Documentation Gitea sur les clés SSH Options Home Manager pour Git Delta - Un meilleur diff Git —\nConfiguration testée sur NixOS 25.11 avec Home-Manager et Forgejo 1.21\n","date":"2025-12-11T17:06:09+01:00","permalink":"https://atlanticaweb.fr/p/2025/12/11/configuration-git-avec-signature-de-commits-par-cl%C3%A9-ssh/","title":"Configuration Git avec signature de commits par clé ssh"},{"content":" Il y a quelques jours, on a eu la publication de Nixos 25.11.\nComme d\u0026#39;habitude, ça se passe très bien.\nEn ce qui me concerne, les impacts :\nchangement dans la conf hyprland pour le swipe. J\u0026#39;ai pour l\u0026#39;instant désactivé, faut que je regarde les changement en détail. J\u0026#39;suis pas vraiment impacté, c\u0026#39;était réglé à false. git : passage de gitFull, j\u0026#39;ai du revoir la partie settings et en particulier supprimer la partie ExtraSettings. C\u0026#39;est ici que j\u0026#39;ai eu le plus gros travail. Rien de bloquant, juste des warnings à traiter; Gnome et GDM ont été renommés (enfin l\u0026#39;option), faudra que je supprime gnome et que je remplace GDM par un truc plus adapté. et le plus impactant : networkmanager. Les vpn sont maintenant en plugin. Rien de plus. Pour mon blog, aucun travail, consternant tellement ça marche :\u0026#39;D. ","date":"2025-12-10T16:17:19+01:00","permalink":"https://atlanticaweb.fr/p/2025/12/10/nixos-2511/","title":"nixos-2511"},{"content":" Pourquoi choisir Nixos pour une infra as code ? Lorsque l\u0026#39;on pense Infra As Code, on pense Ansible, Puppet, Salt etc… mais aussi, terraform, Opentoxffu. On pense aussi à du kube, à des systèmes immuables et à des distributions classiques.\nIci nous allons parler d\u0026#39;une Infra As Code qui utilise Nix, Nixos, Flake et quelques autre programmes de la galaxie Nixos.\nLes avantages Les bénéfices en synthèse :\nImmuable; Reproductible; Modulaire; Adaptée au travail d\u0026#39;équipe; Versionnable; Des containers légers (pas docker, pas lxc); Dans le détail ça donne : Quand on utilise Nixos, on produit une distribution immuable. Tout le système est en lecture seule. Il faut reconstruire le système pour le modifier. Quand on utilise Flake et le fichier flake.lock on a aussi la reproductivité complète (à la version exacte), ou de la reproductivité à la version courante, si on utilise pas flake.lock.\nLe code est versionnable. On peut même faire de la CI/CD. Le code est modulaire, donc ré-employable.\nC\u0026#39;est tout ? Nixos a intégré systemd-nspawn dans *Nixos Containers, qui permet de faire des container (même store que l\u0026#39;hôte) avec tous les avantages Nixos. En gros c\u0026#39;est un chroot amélioré. Nixos a intégré la création d\u0026#39;images à destination des principaux cloud public, mais également de vmware, de Proxmox et de Proxmox-LXC.\nComment orchestrer ? En 2024, et plus précisément depuis la version 24.05, l\u0026#39;utilitaire nixos-rebuild a été ré-écrit de bash en Python et intègre une fonctionalité de déploiement.\nIl s\u0026#39;agit de l\u0026#39;option `–target-host`.\nDonc de base, nixos-rebuild vous permet de contruire des VM, des systèmes, des systèmes autres, de tester les modifications, de construire un système distant depuis votre poste ou d\u0026#39;un système autre (avec plus de cpu/ram pour construire plus), et de déployer des systèmes immuables distant. Un véritable couteau suisse.\nC\u0026#39;est fini ? Non. Nixos et sa galaxie c\u0026#39;est aussi :\nColmena : un utilitaire pour faire de la construction et du déploiement de masse (plusieurs milliers de machines); nixos-generate : pour fabriquer vos images de base à destination de Proxmox, Proxmox-lxc, lxc, doker, kube, amazon etc… Terranix : un terraform à la sauce Nixos Vous avez compris je pense, à partir de cette distribution, vous avez de quoi faire de l\u0026#39;immuable, de l\u0026#39;IAC pour quelques vm/containers ou du passage à l\u0026#39;échelle. Adieu Puppet/Foreman, adieux Ansible/Tower, adieu Fedora Silverblue.\nVous avez des serveurs physiques et vous voulez un cloud privé : utilisez Terranix pour gérer Proxmox, Colmena pour orchestrer les déploiement massifs, nixos-generate pour la création des images, flakes pour la configuration.\nVous avez une dizaine de containers/VM : utilisez nixos-rebuild pour construire et déployer, flake pour les configurations.\nEt toujours git et vous pouvez utiliser Forgejo (mais pas que) pour mettre en place du CI/CD et automatiser au maximum.\nLes bases de votre IAC sont posées. La prochaine fois, on va aborder la mise en pratique.\n","date":"2025-12-08T16:38:21+01:00","permalink":"https://atlanticaweb.fr/p/2025/12/08/infra-as-code-la-solution-nixos/","title":"Infra As Code : la solution Nixos"},{"content":" J\u0026#39;utilise Hetzner pour un petit VPS, pour ce blog, un git et quelques bricoles.\nHetzner propose de sepasser d\u0026#39;IPV4 et d\u0026#39;avoir qu\u0026#39;une IPV6.\nIl est possible d\u0026#39;avoir une IPV4, mais c\u0026#39;est plus cher de quelques centimes. C\u0026#39;etait donc l\u0026#39;occasion de tester le full IPV6.\nLa réalité, c\u0026#39;est que tous ne sont pas prêt. Certains projets sont incompatible avec les IP v6 et plus exactement avec les ::: que l\u0026#39;on va retrouver. Bien souvent il existe des moyens de contournement (enregistrement DNS par exemple), mais parfois, on va avoir besoins de s\u0026#39;adresser à un service IPV4 only, et là, c\u0026#39;est la merde.\nJ\u0026#39;ai donc opté, par l\u0026#39;ajout d\u0026#39;une IPV4 à mon VPS.\nComment ça se passe sous Nixos ? Souvenez vous, j\u0026#39;avais utilisé nix-infect pour passer mon VPS sous Nixos.\nDe quoi avons nous besoins ?\nl\u0026#39;IP v4 bien sur la passerelle pour sortir sur le net : 172.31.1.1 le serveur DNS interne d\u0026#39;hetzner : 185.12.64.1 https://docs.hetzner.com/dns-console/dns/general/recursive-name-servers/ En terme de code, ça donne ça :\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 { lib, ... }: { # This file was populated at runtime with the networking # details gathered from the active system. networking = { nameservers = [ \u0026#34;2a01:4ff:ff00::add:2\u0026#34; \u0026#34;2a01:4ff:ff00::add:1\u0026#34; \u0026#34;185.12.64.1\u0026#34; ]; defaultGateway = { address = \u0026#34;172.31.1.1\u0026#34;; interface = \u0026#34;eth0\u0026#34;; }; defaultGateway6 = { address = \u0026#34;fe80::1\u0026#34;; interface = \u0026#34;eth0\u0026#34;; }; dhcpcd.enable = false; usePredictableInterfaceNames = lib.mkForce false; interfaces = { eth0 = { ipv4.addresses = [ { address=\u0026#34;65.108.157.54\u0026#34;; prefixLength=32; } ]; ipv6.addresses = [ { address=\u0026#34;2a01:4f9:c012:a658::1\u0026#34;; prefixLength=64; } { address=\u0026#34;fe80::9400:4ff:fe26:7f9f\u0026#34;; prefixLength=64; } ]; ipv4.routes = [ { address = \u0026#34;172.31.1.1\u0026#34;; prefixLength = 32; } ]; ipv6.routes = [ { address = \u0026#34;fe80::1\u0026#34;; prefixLength = 128; } ]; }; }; }; services.udev.extraRules = \u0026#39;\u0026#39; ATTR{address}==\u0026#34;96:00:04:26:7f:9f\u0026#34;, NAME=\u0026#34;eth0\u0026#34; \u0026#39;\u0026#39;; } Le diff du fichier :\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 diff --git a/networking.nix b/networking.nix index 6064061..bf1e12b 100644 --- a/networking.nix +++ b/networking.nix @@ -4,11 +4,12 @@ networking = { nameservers = [ \u0026#34;2a01:4ff:ff00::add:2\u0026#34; \u0026#34;2a01:4ff:ff00::add:1\u0026#34; + \u0026#34;185.12.64.1\u0026#34; ]; defaultGateway = { - address = \u0026#34;fe80::1\u0026#34;; + address = \u0026#34;172.31.1.1\u0026#34;; interface = \u0026#34;eth0\u0026#34;; - }; + }; defaultGateway6 = { address = \u0026#34;fe80::1\u0026#34;; interface = \u0026#34;eth0\u0026#34;; @@ -18,16 +19,15 @@ interfaces = { eth0 = { ipv4.addresses = [ - { address=\u0026#34;100.66.241.88\u0026#34;; prefixLength=32; } + { address=\u0026#34;65.108.157.54\u0026#34;; prefixLength=32; } ]; ipv6.addresses = [ { address=\u0026#34;2a01:4f9:c012:a658::1\u0026#34;; prefixLength=64; } -{ address=\u0026#34;fe80::9400:4ff:fe26:7f9f\u0026#34;; prefixLength=64; } + { address=\u0026#34;fe80::9400:4ff:fe26:7f9f\u0026#34;; prefixLength=64; } ]; - ipv4.routes = [ { address = \u0026#34;\u0026#34;; prefixLength = 32; } ]; + ipv4.routes = [ { address = \u0026#34;172.31.1.1\u0026#34;; prefixLength = 32; } ]; ipv6.routes = [ { address = \u0026#34;fe80::1\u0026#34;; prefixLength = 128; } ]; }; - }; }; services.udev.extraRules = \u0026#39;\u0026#39; ","date":"2025-11-24T13:35:33+01:00","permalink":"https://atlanticaweb.fr/p/2025/11/24/hetzner-ajouter-une-ipv4-%C3%A0-un-vps/","title":"Hetzner ajouter une ipv4 à un VPS"},{"content":" Intégrer un diagramme de Gantt à un fichier Org Lorsque l\u0026#39;on gère un projet, informatique ou non, il faut pouvoir contruire un rétro-planning.\nIl existe des modules dans emacs, qui permettent de transformer vos taches en diagramme, mais j\u0026#39;avoue ne pas avoir été séduit.\nEntre la lourdeur de configuration et le rendu pas souvent à la hauteur de ce qu\u0026#39;il se fait aujourd\u0026#39;hui, j\u0026#39;ai lâché l\u0026#39;affaire jusqu\u0026#39;à ce que je tombe sur Plantuml.\nPlantuml est un logiciel libre qui permet de générer des diagrammes, Gantt ou non, à partir d\u0026#39;un simple fichier texte.\nLa documentation est complète (y a même un pdf en français de plus de 500 pages). Et vous pouvez faire des choses intéressantes comme définir des jours fériés ou non travailler, affecter des ressources etc.. Le fonctionnement est similaire à Taskjuggler, mais en plus simple et avec un rendu png très propre.\nPlantuml utilise des verbes (starts, ends, then etc..) ce qui le rend facile à lire.\nEn 10 minutes on a compris la syntaxe et produit quelques chose.\nJ\u0026#39;ai donc opté pour une utilisation avec Babel. L\u0026#39;avantage est d\u0026#39;avoir quelque chose qui marche tout le temps, et de portable, de pas avoir une fonction Lisp à maintenir ou faire évoluer pour profiter d\u0026#39;une fonctionnalité.\nPour intégrer un diagramme Plantuml il suffit d\u0026#39;un bout de code comme :\n1 2 3 !theme spacelab a -\u0026gt; b b -\u0026gt; c Pour générer le png, il suffit de faire C-c C-c et votre png sera disponible dans ~/.emacs.d/gantt/\nDans ma configuration emacs, j\u0026#39;ai également ajouté :\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ; Charger ob-plantuml (require \u0026#39;ob-plantuml) ;; Utiliser le binaire plantuml plutôt que le jar (setq org-plantuml-exec-mode \u0026#39;plantuml) ;; Indiquer le chemin du binaire (dans ton profil Nix) (setq org-plantuml-executable-path \u0026#34;/home/alexandre/.nix-profile/bin/plantuml\u0026#34;) ;; Pour afficher automatiquement les images générées dans org-mode (setq org-display-inline-images t) ;; Déclare les langages pour org-babel (org-babel-do-load-languages \u0026#39;org-babel-load-languages \u0026#39;((emacs-lisp . t) (plantuml . t))) ","date":"2025-10-08T08:48:22+02:00","permalink":"https://atlanticaweb.fr/p/2025/10/08/gantt-org-mode/","title":"gantt-org-mode"},{"content":"Comment avoir une vue d\u0026rsquo;ensemble des actions/taches sur un mois ? Suivre ses taches dans org-mode est très pratiques.\nLes fonctions de l\u0026rsquo;agenda permettent d\u0026rsquo;avoir, par exemple, une vue rapide sur les encours. exemple.\nMoins souvent cité, il y a également la possibilité d\u0026rsquo;afficher les taches, de la semaine, d\u0026rsquo;un mois en particulier ou de l\u0026rsquo;année.\nIl s\u0026rsquo;agit d\u0026rsquo;un buffer qu\u0026rsquo;on appel de la manière suivante, depuis une vue de l\u0026rsquo;agenda (peu importe laquelle) :\nx v m il faut remplacer x par le numéro du mois que l\u0026rsquo;on souhaite afficher: 1 pour janvier et 12 pour décembre :)\nv équivaut à view\nm équivaut à month On peut remplacer m par w pour afficher un numéro de semaine en particulier (tu voulais voir les taches effectuées la seconde semaine de l\u0026rsquo;année ?) ou y pour afficher une année particulière.\nExemple :\n2024vy =\u0026gt; affiche l'année 2024 29vw =\u0026gt; affiche la semaine 29 5vm =\u0026gt; affiche le mois de mai de l'année Dans ce buffer, il est possible de limiter les taches liée à 1 ou plusieurs tags via / suivis du tag à sélectionner ou -tag pour retirer un tag particulier.\n","date":"2025-05-05T16:09:15+02:00","permalink":"https://atlanticaweb.fr/p/2025/05/05/afficher-un-mois-complet-dans-lagenda-org-mode/","title":"Afficher un mois complet dans l'agenda org-mode"},{"content":"Utiliser emacs comme CRM Il existe une multitude d\u0026rsquo;outils et méthodes pour gérer son quotidien, professionnel ou personnel.\nUn CRM, n\u0026rsquo;est qu\u0026rsquo;un logiciel orienté client. Souvent, ils sont en ligne, utilisent des BDD, revendiquent des KANBAN pour faciliter la vue et le suivi, certains poussent le vice à ajouter des boutons pour appeler directement le contact etc\u0026hellip; avec en plus des tableaux de bord orienté CA ou mesure de la performance. Chose que l\u0026rsquo;on fait bien mieux avec des outils adaptés à générer des graphiques, des alertes comme grafana.\nA force d\u0026rsquo;utiliser emacs et org-roam en particulier pour gérer mes notes, j\u0026rsquo;ai fini par mettre au point un wokflow et une configuration de travail qui me permet :\nd\u0026rsquo;avoir une fiche complète de mes clients et prospects; d\u0026rsquo;avoir un suivi de ce que j\u0026rsquo;ai à faire; d\u0026rsquo;avoir une vue sur ce que j\u0026rsquo;ai fais la semaine précédente; de filtrer les actions à faire ou en cours relativent à un client ou un prospect ou même personnel. L\u0026rsquo;an passé, j\u0026rsquo;avais fait un premier article sur mon workflow.\nDepuis j\u0026rsquo;ai apporté pas mal de modifications, et j\u0026rsquo;ai appris beaucoup de choses.\nIl était donc temps pour moi d\u0026rsquo;affiner certaines pratiques, et de coucher dans un nouvel article mes nouvelles habitudes de travail.\nLes tags Les tags sont au centre de ma configuration actuelle.\nVous pouvez définir des tags qui s\u0026rsquo;excluent et des tags qui peuvent fonctionner ensemble.\nPar exemple avoir un tag prospect et un tag réunion, c\u0026rsquo;est cumulable.\nAvoir un tag client1 et un tag client2 non cumulable.\nLes tags vous permettront de filtrer les en cours ou les choses à faire, planifiées ou non.\nLa liste des tags n\u0026rsquo;a pas besoins d\u0026rsquo;être figée, elle va vivre tout au long de vos activités.\nExemple de déclaration de tags :\n1 2 3 4 5 6 7 setq org-tag-alist \u0026#39;( (:startgroup . nil) (\u0026#34;@CLIENT1\u0026#34; . ?n) (\u0026#34;@CLIENT2\u0026#34; . ?a) (:endgroup . nil) ;; TYPE (\u0026#34;DEVIS\u0026#34; . ?d) (\u0026#34;TACHE\u0026#34; . ?t) (\u0026#34;COPIL\u0026#34; . ?C) (\u0026#34;CLIENT\u0026#34; . ?c)(\u0026#34;PROSPECT\u0026#34; . ?o) (\u0026#34;PERSO\u0026#34; . ?z)) org-roam org-roam est un mode emacs qui vient \u0026ldquo;compléter\u0026rdquo; org-mode.\nIl enregistre la référence à chaque fiche dans une base sqlite, ce qui permet de faire des liens entre les fiches.\nUne fiche peut-être un fichier seul ou à l\u0026rsquo;intérieur d\u0026rsquo;un fichier avec d\u0026rsquo;autres fiches.\nUn des gros avantages, c\u0026rsquo;est la commande org-roam-node-find qui permet de retrouver une fiche ou de la créer si elle existe pas.\nJ\u0026rsquo;utilise org-roam depuis deux ans, j\u0026rsquo;ai donc tout un tas de notes existantes.\nL\u0026rsquo;autre avantage, c\u0026rsquo;est que lors de la création d\u0026rsquo;une nouvelle fiche, on peut sélectionner le template à utiliser.\nJ\u0026rsquo;ai ainsi créé un template type pour un nouveau client.\ntemplate org-roam Lorsque l\u0026rsquo;on utilise org-roam-capture-templates si on fait un seul template, c\u0026rsquo;est le nouveau template par defaut qui sera appliqué à chaque fois.\nJ\u0026rsquo;ai donc créé 2 template, un template standard et un template pour les nouveaux clients.\n1 2 3 4 5 6 7 8 9 (org-roam-capture-templates \u0026#39;((\u0026#34;d\u0026#34; \u0026#34;default\u0026#34; plain \u0026#34;%?\u0026#34; :target (file+head \u0026#34;%\u0026lt;%Y%m%d%H%M%S\u0026gt;-${slug}.org\u0026#34; \u0026#34;#+title: ${title}\\n\u0026#34;) :unnarrowed t) (\u0026#34;c\u0026#34; \u0026#34;Nouveau client\u0026#34; plain \u0026#34;%?\u0026#34; :if-new (file+head \u0026#34;%\u0026lt;%Y%m%d%H%M%S\u0026gt;-${slug}.org\u0026#34; \u0026#34;#+title: ${title}\\n* Client :CLIENT:\\n** Synthèse\\n** Facturation\\n** COPIL :COPIL:\\n** Taches :TACHE:\\n\u0026#34;) :unnarrowed t) ) ) Dans le block ci-dessus, le template default recrée le template habituel de création d\u0026rsquo;une nouvelle note.\nLe second template Nouveau client créer une fiche type pour un nouveau client, en fonction de ce que je souhaite avoir comme suivi.\nJ\u0026rsquo;ai intégré les tags COPIL et TACHE car je vais en avoir besoins pour le filtrage des activités à suivre.\nVous l\u0026rsquo;aurez donc compris ici, il est relativement facile de se créer des templates adaptés à vos besoins.\nEnvoyer un compte rendu par mail Lorsque je débute une réunion, j\u0026rsquo;ouvre la fiche client. Dans la section COPIL je mets toutes mes réunions, ça donne ça :\n1 2 3 ** COPIL :COPIL: *** COPIL du [2025-02-06 jeu.] ... *** COPIL du [2025-03-03 jeu.] ... Quand je préside une nouvelle réunion, je crée un nouveau subtree en date du jour, et je fais mon compte rendu.\nEn fin de réunion, j\u0026rsquo;ai plus qu\u0026rsquo;à envoyer mon compte rendu par mail.\nJ\u0026rsquo;utilise pour ça org-mime\n1 2 (use-package org-mime :ensure t) et pour la partie smtp :\n1 2 3 4 5 6 7 ;; smtp (setq smtpmail-smtp-server \u0026#34;smtp.mondomaine.fr\u0026#34; ; Serveur SMTP (ex: smtp.gmail.com) smtpmail-smtp-service 587 ; Port (587 pour STARTTLS, 465 pour SSL) smtpmail-stream-type \u0026#39;starttls ; Type de chiffrement (starttls ou ssl) smtpmail-auth-credentials \u0026#34;~/.authinfo.gpg\u0026#34; ; Fichier d\u0026#39;authentification sécurisé send-mail-function \u0026#39;smtpmail-send-it smtpmail-default-smtp-server \u0026#34;smtp.mondomaine.fr\u0026#34;) Pour envoyer le subtree par mail, il me suffit alors d\u0026rsquo;exécuter la commande org-mime-org-subtree-htmlize qui va transformer le subtree en une \u0026ldquo;page\u0026rdquo; indépendante à mon fichier org avec les items mails suivants :\n1 2 3 To: Subject: COPIL Firewall From: Alexandre \u0026lt;alexandre@mondomaine.fr\u0026gt; Il me reste alors à ajouter les adresses des destinataires, éventuellement une ligne avec CC: et d\u0026rsquo;envoyer le tout via C-c C-c.\nTout le reste du texte qui était au format org-mode à été transformé en html.\nQuid des actions immédiates à noter (appel téléphonique, idée Etc\u0026hellip;) ? Pour répondre à ce besoins, j\u0026rsquo;ai un fichier backlog.org et pour le compléter j\u0026rsquo;utilise org-capture\norg-capture permet d\u0026rsquo;enregistrer rapidement une tache et d\u0026rsquo;y revenir plus tard.\nAinsi quand le téléphone sonne ou que démarre un point imprévu, ou que j\u0026rsquo;ai une nouvelle idée, j\u0026rsquo;appel org-capture je prends mes notes, j\u0026rsquo;enregistre et je retourne à mon travail.\nEn fin de journée, je fais une passe et je déplace éventuellements les notes dans la bonne fiche.\n1 2 3 4 5 setq org-capture-templates \u0026#39;((\u0026#34;t\u0026#34; \u0026#34;TODO backlog.org\u0026#34; entry (file+headline \u0026#34;~/Nextcloud/notes/backlog.org\u0026#34; \u0026#34;A Faire\u0026#34;) \u0026#34;* TODO [#B] %? \\n:Created: %T\\n\u0026#34; :empty-lines 0)) Pour déplacer une tache ainsi créée dans un autre fichier, j\u0026rsquo;utilise les commandes de bases d\u0026rsquo;emacs à savoir : C-c C-x C-w pour couper le subtree complet, j\u0026rsquo;ouvre la note de destination et je colle avec C-y\norg-agenda : le suivis J\u0026rsquo;ai donc des fiches, et différents tags. Pour assurer un suivis efficace, rien de mieux qu\u0026rsquo;org-agenda.\nLorsque j\u0026rsquo;appel org-agenda, outres les fonctionnalités habituelles (affichage des todo, des taches planifiées etc\u0026hellip;) il y a la possibilité d\u0026rsquo;afficher/trier en fonction des tags, ou selon une date de référence.\nJ\u0026rsquo;ai donc :\nTâches terminées et en cours de la semaine précédente Toutes les taches en status TODO et En cours Toutes les taches en status TODO et En cours pour un prospect Toutes les taches en status TODO et En cours pour un client en particulier (par exemple lors de grosses phases projets) Les taches perso etc\u0026hellip; Exemple du code pour customiser l\u0026rsquo;agenda :\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 (setq org-agenda-custom-commands \u0026#39;( ;; Vue pour les tâches avec le tag PROSPECT (\u0026#34;p\u0026#34; \u0026#34;Taches avec le tag: PROSPECT\u0026#34; tags-todo \u0026#34;+PROSPECT\u0026#34; ((org-agenda-overriding-header \u0026#34;Taches avec le tag PROSPECT\u0026#34;))) (\u0026#34;A\u0026#34; \u0026#34;Taches avec le tag: Client1\u0026#34; tags-todo \u0026#34;+@CLIENT1\u0026#34; ((org-agenda-overriding-header \u0026#34; Suivi des actions en cours pour Client1\u0026#34;) (org-agenda-sorting-strategy \u0026#39;(priority-down)) )) (\u0026#34;c\u0026#34; \u0026#34;Taches avec le tag: CLIENT\u0026#34; tags-todo \u0026#34;+CLIENT\u0026#34; ((org-agenda-overriding-header \u0026#34;Taches avec le tag CLIENT\u0026#34;))) (\u0026#34;t\u0026#34; \u0026#34;Taches avec le tag: TACHE\u0026#34; tags-todo \u0026#34;+TACHE\u0026#34; ((org-agenda-overriding-header \u0026#34;Taches avec le tag TACHE\u0026#34;))) (\u0026#34;z\u0026#34; \u0026#34;Taches avec le tag: PERSO\u0026#34; tags-todo \u0026#34;+PERSO\u0026#34; ((org-agenda-overriding-header \u0026#34;Taches avec le tag PERSO\u0026#34;))) (\u0026#34;w\u0026#34; \u0026#34;Semaine précédente\u0026#34; ((agenda \u0026#34;\u0026#34; ((org-agenda-span 7) (org-agenda-start-on-weekday 1) (org-agenda-start-day \u0026#34;-7d\u0026#34;) (org-agenda-show-log t) (org-agenda-log-mode-items \u0026#39;(closed state))))) ((org-agenda-overriding-header \u0026#34;Tâches terminées et en cours de la semaine précédente\u0026#34;))) )) Pour aller plus loin Vous pouvez facilement ajouter les fonctionnalités org-clock pour mesurer le temps passer sur chaque client/tache et avoir un tableau de suivi des temps synthétique.\nAu delà de org-mode, vous pouvez ajouter de l\u0026rsquo;IA (pour du contenu, de la correction ortho etc..)\nVous pouvez surtout adapter ce workflow très très facilement, car ça reste souple.\n","date":"2025-03-24T19:33:14+01:00","permalink":"https://atlanticaweb.fr/p/2025/03/24/emacs-en-crm/","title":"Emacs en CRM"},{"content":"Présentation de easy-hugo Ce blog est statique, et s\u0026rsquo;appuis sur Hugo.\nLe workflow de base, c\u0026rsquo;est écrire un nouveau fichier, générer les fichiers html, vérifier que tout est OK et copier les fichiers générés sur le serveur distant, avec rsync.\nL\u0026rsquo;idéal c\u0026rsquo;est de mettre un workflow de CI/CD qui va automatiquement publier le code généré, lorsque le nouvel article est ajouté au git. Mais ajouter ce type de workflow, nécessite de configurer des outils complémentaires comme woodpecker. C\u0026rsquo;est la prochaine étape, peut-etre (mode flemme).\nEn attendant, pour me faciliter la tâche, j\u0026rsquo;ai opté pour easy-hugo.\neasy-hugo est un mode emacs qui facilite le travail.\nJ\u0026rsquo;utilise principalement les commandes suivantes :\neasy-hugo easy-hugo-preview easy-hugo-publish easy-hugo-newpost Configuration La configuration de ce mode est très simple :\n(use-package easy-hugo :init (setq easy-hugo-basedir \u0026quot;~/git/atlanticaweb.fr\u0026quot;) (setq easy-hugo-postdir \u0026quot;content/post\u0026quot;) (setq easy-hugo-default-archetype \u0026quot;post\u0026quot;) (setq easy-hugo-url \u0026quot;https://atlanticaweb.fr\u0026quot;) (setq easy-hugo-previewtime \u0026quot;300\u0026quot;)) (setq easy-hugo-server-flags \u0026quot;-D\u0026quot;) (setq easy-hugo-sshdomain \u0026quot;atlanticaweb.fr\u0026quot;) (setq easy-hugo-root \u0026quot;/srv/www/atlanticaweb.fr/\u0026quot;) (setq easy-hugo-default-ext \u0026quot;.org\u0026quot;) Par défaut, quand on appelle la commande easy-hugo-newpost c\u0026rsquo;est un fichier markdown qui est proposé.\nC\u0026rsquo;est l\u0026rsquo;option easy-hugo-default-ext qui permet de choisir un autre format par defaut parmis ceux supportés (rst, org etc..)\nLe nom des options est facile à comprendre, elles permettent de définir le dossier qui contient le site, les nouveaux articles, l\u0026rsquo;url, le temps ou les objets générés sont accessibles, le mode du serveur preview, la connexion ssh, le dossier sur le serveur distant et donc le format des fichiers.\nLe nom des commandes est également facile à comprendre:\neasy-hugo-preview : lance hugo en mode serve pour prévisualiser l\u0026rsquo;article easy-hugo-publish : transforme les fichiers en html et les pousses sur le serveur web easy-hugo-newpost : crée un nouvel article en s\u0026rsquo;appuyant sur le modèle (de base ou celui créé). Vous pouvez facilement créer votre template, il suffit de mettre dans le dossier ~/.emacs.d* un dossier nommé easy-hugo-templates/\nCe mode permet de publier sur beaucoup d\u0026rsquo;infra différente, et simplifie franchement le travail.\n","date":"2024-12-31T17:11:14+01:00","permalink":"https://atlanticaweb.fr/p/2024/12/31/easy-hugo/","title":"Easy Hugo"},{"content":"Ce blog était répartis entre 2 dépôts git. Un premier dépot avec les fichiers de configurations, thèmes etc\u0026hellip; et un second dédié au contenu.\nHugo permet de dissocier les dossiers, via l\u0026rsquo;instruction contentDir.\nLe hic, c\u0026rsquo;est que tous les outils ne le comprennent pas.\nJ\u0026rsquo;ai donc décidé de fusionner les 2 dépôts. Comment faire ça, sans perdre l\u0026rsquo;historique git ?\nLa suite est la méthode que j\u0026rsquo;ai utilisé.\nAjouter le dépôt secondaire comme dépôt distant du dépôt principal Ajoutez le second dépôt (celui que vous voulez fusionner) comme un dépôt distant distinct.\ngit remote add depot-secondaire \u0026lt;URL-du-depot-secondaire\u0026gt;\nRécupérer les branches On récupère toutes les branches du dépôt secondaire :\ngit fetch\nFusionner les dépôts Il faut créer une nouvelle branche et basculer dessus :\ngit checkout -b branche-depot-secondaire\nFusionner la branche principale du dépôt secondaire à notre nouvelle branche\ngit merge depot-secondaire/master --allow-unrelated-histories\n--allow-unrelated-histories : cette option permet de fusionner 2 dépôts qui n\u0026rsquo;ont rien à voir entre eux.\nFusion de la branche du dépôt secondaire sur le master du primaire Si vous avez suivi, on a 2 branches : master qui est la branche principale du dépôt qu\u0026rsquo;on garde et une branche branche-depot-secondaire qui contient les fichier du master du dépôt qu\u0026rsquo;on va supprimer.\nOn repart sur notre branche principale :\ngit checkout master\nOn merge les 2 branches :\ngit merge branche-depot-secondaire\nvalider la fusion :\ngit commit\nA partir de maintenant, vous avez les fichiers dans votre dépôt principal et l\u0026rsquo;ensemble de l\u0026rsquo;historique git.\nMénage On supprime la branche distante :\ngit remote remove depot-secondaire\nOn supprime la branche devenue inutile :\ngit branch -d branche-depot-secondaire\n","date":"2024-12-31T16:27:02+01:00","permalink":"https://atlanticaweb.fr/p/2024/12/31/fusionner-un-d%C3%A9pot-git-dans-un-autre/","title":"Fusionner un dépot git dans un autre"},{"content":"Contexte J\u0026rsquo;utilise au quotidien org-mode. Je n\u0026rsquo;utilise pas m4e pour mes mails, car je n\u0026rsquo;arrive pour l\u0026rsquo;instant pas à reproduire l\u0026rsquo;utilisation que j\u0026rsquo;ai d\u0026rsquo;evolution.\nMon problème est que j\u0026rsquo;aimerai bien tout centraliser, comme les comptes rendus de réunion, ou plus simplement, partager avec quelqu\u0026rsquo;un une note.\nLa solution de contournement org-mode dispose d\u0026rsquo;un module d\u0026rsquo;export, et c\u0026rsquo;est lui qu\u0026rsquo;on va utiliser.\nIl suffit de faire un export (C-c C-e) au format html (h) et dans un nouveau buffer (H) puis de sauvegarder le buffer (C-x s) dans un fichier mail.html qu\u0026rsquo;on importera dans notre mail.\nPour avoir la table des matières en français, il faut ajouter le code suivant à la configuration d\u0026rsquo;emacs :\n(add-to-list 'org-latex-packages-alist '(\u0026quot;AUTO\u0026quot; \u0026quot;babel\u0026quot; nil)) Et sur chaque fiche org-mode ajouter le marqueur :\n#+LANGUAGE: fr ","date":"2024-08-27T00:00:00Z","permalink":"https://atlanticaweb.fr/p/2024/08/27/envoyer-une-note-par-mail/","title":"Envoyer une note par mail"},{"content":"Renforcer la sécuritée de son poste avec l\u0026rsquo;utilisation de clés USB FIDO et utilisation du double facteur Depuis quelques temps j\u0026rsquo;utilise une clé USB Yubikey en guise de challenge-response pour de l\u0026rsquo;authentification et du déchifrement de mon poste de travail.\nLa clé Yubikey est parfaite pour ça. Elle est mince et solide, reconnu partout. C\u0026rsquo;est top et c\u0026rsquo;est un magnifique SPOF. Vous la perdez et vous avec plus rien.\nC\u0026rsquo;est également une clée relativement honéreuse (compter 60€ fdpin), et c\u0026rsquo;est pas ouvert.\nDans l\u0026rsquo;univers des fabricants de ce type de dispositifs, vous avez également Solo et nitrokey.\nNitrokey fabrique différent périphériques, comme la Nitrokey Pro, la FIDO2 etc\u0026hellip; L\u0026rsquo;avantage de ce fabricant, c\u0026rsquo;est que le matériel est conçu et fabriqué en europe (allemagne pour être précis) et en Openhardware, avec des mises à jour des firmware.\nN\u0026rsquo;utilisant pas (encore ?) les fonctionnalités gpg et authentification ssh de la yubikey, je cherchais un moyen pas trop honnéreux pour venir seconder ma Yubi.\nJ\u0026rsquo;avais acheté il y a quelques temps une Nitrokey Pro 2 et une FIDO2, mais je m\u0026rsquo;en étais encore jamais vraiment occupé. Entre temps, ils ont sorti la Nitrokey Pro 3 qui inclus le protocole FIDO2.\nUn jour je passerai certainement dessus, mais en attendant, on va faire avec ce que l\u0026rsquo;on possède déjà.\nEnfin, j\u0026rsquo;ai récemment changé de PC. J\u0026rsquo;en ais donc profité pour revoir tout ça.\nChiffrement de partitions Historiquement mon poste était chiffré en utilisant une méthode similaire à ça : https://github.com/sgillespie/nixos-yubikey-luks\nC\u0026rsquo;est bien mais en faite c\u0026rsquo;est assez limitant. Pour ajouter une clée de backup, c\u0026rsquo;est certainement jouable, mais j\u0026rsquo;ai eu trop peur de casser quelques choses. J\u0026rsquo;ai donc opté pour une autre méthode disponible depuis Nixos 23.05, à savoir systemd-cryptenroll\nAvec systemd-cryptenroll vous pouvez ajouter autant de clés que vous voulez, plusieurs mots de passes, générer un mot de passe de secour en cas de perte (recovery, généré par le système). Mais vous pouvez également supprimer tout ou partie de ces moyens.\nCela signifie, que vous pouvez avoir une Master key dans l\u0026rsquo;entreprise, capable de déchiffrer tous les postes, et changer de clés quand vous voulez.\nTypiquement, ajouter une clée Yubikey ou Nitrokey, ça se fait simplement (et même après l\u0026rsquo;installation) :\nsystemd-cryptenroll /dev/nvme0n1p2 --fido2-device=auto --fido2-with-client-pin=true Ici on ajoute la clée avec son code PIN (à activer au préalable). Notre déchiffrement 2FA est bon. Rien de plus simple, n\u0026rsquo;est pas ?\nEt pour l\u0026rsquo;authentification sur gdm (ou autre gestionnaire) et sudo ?\nPour avoir une Yubi ET une Nitro, sous Nixos, il faut utiliser le même fichier u2f_keys dans les 2 cas.\nEn effet, la doc pour la Yubikey indique :\npamu2fcfg -u alexandre \u0026gt; ~/.config/Yubico/u2f_keys Et pour la Nitrokey :\npamu2fcfg -u alexandre \u0026gt; ~/.config/Nitrokey/u2f_keys Or si vous utilisez la seconde, ça marchera pas. Il faut tout mettre dans .config/Yubico/u2f_keys\nPour le reste de la configuration, je vous laisse aller voire les fichiers de mon template sur le git (mais c\u0026rsquo;est du standard) : https://git.atlanticaweb.fr/alexandre/nixos-config/src/branch/main/hosts/template\nTester c\u0026rsquo;est tricher \u0026hellip; mais ça peut sauver d\u0026rsquo;une erreur :) Pour vérifier que votre configuration est bonne :\nnix-shell -p pamtester pamtester login alexandre authenticate pamtester sudo alexandre authenticate ","date":"2023-12-10T00:00:00Z","permalink":"https://atlanticaweb.fr/p/2023/12/10/nixos-d%C3%A9chiffrement-et-authentification-2fa-fido/","title":"Nixos déchiffrement et authentification 2FA Fido"},{"content":"Pour me connecter à un VPN via Openvpn, j\u0026rsquo;utilise un fichier pks12. Ce fichier à été généré via openssl 1.1. Sous Nixos 22.11, je pouvais utiliser le paquet openvpn_24 qui supportait openssl 1.1, mais depuis la version 23.05, ce paquet n\u0026rsquo;est plus disponible.\nUn seul paquet openvpn est disponible et celui-ci supporte uniquement les credential d\u0026rsquo;OpenSSL 3.3.\nLa suite, n\u0026rsquo;est pas de moi mais de Sylvain.\nLa page avec l\u0026rsquo;information initiale : https://github.com/openssl/openssl/issues/20607\nIl faut commencer par décomposer son fichier pks12. La commande magique :\nopenssl pkcs12 -in cert.p12 -out cert.pem -legacy A partir de là vous avez la capaciter à avoir tous les fichiers (certificat, clé privé etc..) pour regénérer un pks12.\nPour le regénérer, il faut le faire depuis une machine avec openssl 3.3 (ou avoir fait son upgrade) :\nopenssl pkcs12 -export -inkey private.key -in cert -certfile CERT.crt -out nouveau.p12 private.key : votre clé privée extraite précédement cert : votre certificat, extrait précédement CERT.crt : le certificat de la boite, lui aussi issue du pks12 et c\u0026rsquo;est tout \u0026hellip; Faut juste pas oublié qu\u0026rsquo;il faut faire l\u0026rsquo;extraction avec l\u0026rsquo;option -legacy et la création avec une version à jour.\n","date":"2023-07-23T00:00:00Z","permalink":"https://atlanticaweb.fr/p/2023/07/23/openvpn-passer-de-openssl-1.1-%C3%A0-openssl-3.3-quand-on-utilise-un-fichier-pks12/","title":"openvpn : passer de Openssl 1.1 à Openssl 3.3 quand on utilise un fichier pks12"},{"content":"La génèse Insatisfait de ma gestion de suivi de mon activité, j\u0026rsquo;ai cherché des solutions. La méthode GTD ? Org-mode autre ? Après quelques tentatives, je me suis mis à emacs et org-mode avec l\u0026rsquo;espoir de trouver une solution \u0026ldquo;simple\u0026rdquo; et efficace de noter régulièrement mon activité, d\u0026rsquo;avoir une base de connaissance mise à jour régulièrement et une trace de ce qu\u0026rsquo;il me reste à faire.\nAu début, fut org-mode org-mode est un mode majeur d\u0026rsquo;emacs. Il fait parti des modules intégrés. Sa syntaxe est simple, sans être des plus agréable. Mais les automatismes et les modules qui gravitent autour, en font un indispensable.\norg-mode permet d\u0026rsquo;écrire des notes des listes de choses à faire ( les fameux todo), de visualiser dans un agenda les taches/projets etc\u0026hellip;\nPuis vient org-roam org-roam est une application de la méthode zettelkasten basée sur org-mode. Cette méthode vous pousse à écrire des notes et de les lier entre elles. org-roam utilise une base sqlite. Dans cette base sont enregistrer, entre autre, les liens entre les fiches, la liste des fiches, les tags des fiches. L\u0026rsquo;utilisation de tags permet de faire des catégories de fiches.\nLe troisième larron org-journal Cette troisième pièce du puzzle vous permet de maintenir un journal de votre activité journalière et d\u0026rsquo;exploiter la puissance des TODO list avec celle du calendrier.\norg-journal à une fonctionnalité incontournable à mon sens : ce module va récupérer les TODO encore présent dans le journal pour les remettre dans la journée active. Chaque journée fait l\u0026rsquo;objet d\u0026rsquo;un fichier.\nComment tout cela va s\u0026rsquo;articuler ? On va utiliserorg-mode pour sa syntaxe et son ecosystème. J\u0026rsquo;ai 1 fichier org par entreprise. Ce fichier sera la fiche de niveau supérieur. Pour chaque entreprise j\u0026rsquo;ai des fiches de niveau inférieurs qui vont être des fiches prospect, client ou idées produits. Pour chaque prospect, projet ou client, je vais avoir des fiches devis/réunion etc.. La création des fiches, la mise en place des liens et la visualisation/recherche se font via org-roam.\nTout au long de ma journée, j\u0026rsquo;enregistre ce que je fais dans un journal via or-journal. Depuis le journal je fais des liens vers les fiches. Par exemple, on m\u0026rsquo;appel, j\u0026rsquo;ouvre le journal pour enregistrer l\u0026rsquo;appel. Lorsque je sais de quoi il veux parler, j\u0026rsquo;ouvre une note ou j\u0026rsquo;en crée une. Je mets les éléments de notre conversation dans la note, et si derrière j\u0026rsquo;ai une action je rajoute TODO dans le titre de la sous section.\nexemple :\n* appel david ** point_certification ** TODO devis_client1 ** prepa_reunion_prospect J\u0026rsquo;ai ainsi un suivi de mon activité de la journée, et j\u0026rsquo;ai les marqueurs permettant de retrouver ce que j\u0026rsquo;ai à faire.\nLes status des taches J\u0026rsquo;utilise :\nTODO : tache à faire DONE : tache terminée WAIT : tache mise en attente (en attente d\u0026rsquo;un livrable, d\u0026rsquo;un rdv etc..) J\u0026rsquo;ai très peu de WAIT.\nLes tags J\u0026rsquo;utilise les tags pour classifier les taches.\nDEVIS : pour les devis à faire PROJET : concerne les projets clients INTERNE : concerne les projets internes CLIENT : fiche spécifique à un client PROSPECT : fiche spécifique à un prospect J\u0026rsquo;ai différencié les projets internes et clients car mes projets internes sont un fil rouge et se déroule généralement sur des périodes plus longues que les projets clients.\nFonctionnement de la journée Le matin au commancement de la journée, je lance emacs :\nemacsclient -nw Je lance l\u0026rsquo;agenda et j\u0026rsquo;affiche l\u0026rsquo;ensemble des TODO :\nC-ca t TAB permet d\u0026rsquo;aller directement sur l\u0026rsquo;entrée du journal correspondant à la ligne TOTO\nSi au lieu de t je choisi m je peux filtrer par tag. C\u0026rsquo;est à dire que je peux choisir d\u0026rsquo;afficher les devis à faire pour la journée ou les projets\nUne fois que j\u0026rsquo;ai fais le point sur ce qui est prévu, j\u0026rsquo;ouvre le journal du jour et j\u0026rsquo;ajoute ma première activité :\nC-cnj Je rentre donc le titre de mon activité, puis j\u0026rsquo;ouvre une note avec :\nC-cni Avec TAB je peux sélectionner une fiche existante, ou entrer le nom d\u0026rsquo;une nouvelle fiche.\nLorsque l\u0026rsquo;édition de la fiche est terminée (même temporairement) on ferme la fiche et on crée un lien dans le journal via un simple\nC-c C-c Pour ouvrir le lien vers la note : C-c C-o et pour revenir au journal (ou revenir en arrière : C-c \u0026amp; Enfin pour terminer, lorsque je crée une note, je la nomme avec la convention suivante :\nPROJET_xxxx AO_xxx CLIENT_codeclient PROSPECT_nomprospect INTERNE_xxx Les notes principale recevront en fin de journée le lien vers les notes créées ce jour. Ainsi les notes restent liées, conformément à la méthode zettelkasten.\nLa configuration : init.el Maintenant que nous avons vu les principes de base, nous allons passer en revue la configuration de l\u0026rsquo;ensemble.\norg-mode La configuration de org-mode se résume à :\n(require 'org) (require 'org-mouse) (setq org-startup-folded t org-pretty-entities t org-hide-emphasis-markers t org-startup-with-inline-images t org-image-actual-width '(300)) on charge org et org-mouse\nlorsqu\u0026rsquo;un fichier org est ouvert le contenu est \u0026ldquo;replié\u0026rdquo;\nil est possible d\u0026rsquo;utiliser les entities d\u0026rsquo;org-mode. Il s\u0026rsquo;agit d\u0026rsquo;une suite de caractère équivalent à un caractère. Par exemple \\Agrave sera automatiquement remplacé par À\nles symboles utilisés pour mettre en gras, italiques etc.. ne sont pas visible, les mots apparaissent immédiatement en gras etc..\non affiche les images plutot que le lien vers l\u0026rsquo;image\ntaille des images\n(add-to-list \u0026lsquo;auto-mode-alist \u0026lsquo;(\u0026quot;\\.org$\u0026quot; . org-mode))\nchargement du mode org-mode pour tous les fichiers finissant en .org\n(setq org-agenda-files \u0026lsquo;(\u0026quot;~/Nextcloud/PRIVE/13_Org/journal\u0026quot;))\nOn précise que les fichiers à utiliser pour générer l\u0026rsquo;agenda sont dans le dossier journal\norg-roam (setq org-directory (concat (getenv \u0026quot;HOME\u0026quot;) \u0026quot;/Nextcloud/PRIVE/13_Org/notes\u0026quot;)) (use-package org-roam :after org :init (setq org-roam-v2-ack t) ;; Acknowledge V2 upgrade :custom (org-roam-directory (file-truename org-directory)) :config (org-roam-setup) :bind ((\u0026quot;C-c n f\u0026quot; . org-roam-node-find) (\u0026quot;C-c n r\u0026quot; . org-roam-node-random) (:map org-mode-map ((\u0026quot;C-c n i\u0026quot; . org-roam-node-insert) (\u0026quot;C-c n o\u0026quot; . org-id-get-create) (\u0026quot;C-c n t\u0026quot; . org-roam-tag-add) (\u0026quot;C-c n a\u0026quot; . org-roam-alias-add) (\u0026quot;C-c n l\u0026quot; . org-roam-buffer-toggle) (\u0026quot;C-c n o\u0026quot; . org-open-at-point) (\u0026quot;C-M-i\u0026quot; . completion-at-point)))) (org-roam-db-autosync-mode)) * On définit le dossier qui contiendra l'ensemble des fiches créées par org-roam * On crée quelques raccourcis claviers, globaux et propre à org-roam * la dernière ligne force la synchro de la base sqlite à chaque enregistrement org-journal (setq org-journal-date-prefix \u0026quot;#+TITLE: \u0026quot;) (setq org-journal-time-prefix \u0026quot;* \u0026quot;) (setq org-journal-date-format \u0026quot;%a, %Y-%m-%d\u0026quot;) (setq org-journal-file-format \u0026quot;%Y-%m-%d-journal.org\u0026quot;) (setq org-journal-dir \u0026quot;~/Nextcloud/PRIVE/13_Org/journal/\u0026quot;) (global-set-key \u0026quot;\\C-cnj\u0026quot; 'org-journal-new-entry) (require 'org-journal) Les 3 premières lignes correspondent au modèle de fiches que l\u0026rsquo;on souhaite au niveau du journal on précise ou les journaux doivent être création d\u0026rsquo;un raccourci clavier chargement du module The end On a vu ici les principaux éléments de configuration. La partie Tag étant très standard, pas besoins d\u0026rsquo;enfaire une explication. Le fichier de configuration est disponible dans le git\n","date":"2023-01-18T00:00:00Z","permalink":"https://atlanticaweb.fr/p/2023/01/18/org-mode-org-roam-et-org-journal-le-workflow/","title":"org-mode, org-roam et org-journal, le workflow"},{"content":"En juillet j\u0026rsquo;ai fais un article sur la mise en place de sauvegardes via restic et restic server.\nLes sauvegardes fonctionnaient à merveille. Le serveur était un petit dédié à base d\u0026rsquo;atom et 1To d\u0026rsquo;espace disque que je louais chez OneProvider. Il s\u0026rsquo;agissait en réalité d\u0026rsquo;une petite dedibox.\nL\u0026rsquo;OS était donc nixos et cette semaine j\u0026rsquo;ai voulu la passer en version 22.11\nLa montée de version s\u0026rsquo;est bien passée, j\u0026rsquo;ai juste eu besoin de corriger la configuration de caddy. Suite à cette mise à jour majeur, j\u0026rsquo;ai fait un reboot et \u0026hellip;. rien.\nLe serveur n\u0026rsquo;a jamais redémarré, et rien via l\u0026rsquo;ipmi. Je contact le support et quelques heures après on m\u0026rsquo;annonce que le serveur est mort et qu\u0026rsquo;ils n\u0026rsquo;ont pas de machines de secours.\nOn me propose un remboursement, soit. Le plus étrange c\u0026rsquo;est que j\u0026rsquo;ai eu exactement la même chose à l\u0026rsquo;automne avec un autre petit serveur à 5€/mois.\nC\u0026rsquo;est pas un drame, mais la pratique commerciale est un peu fumeuse. Le vrai problème c\u0026rsquo;est que j\u0026rsquo;avais plus de sauvegarde :/\nAprès une recherche, je découvre l\u0026rsquo;offre de Hetzner pour des storages boxes. Le tarif est top (compter 3.84€/mois) pour un espace de stockage de 1To.\nLe processus de souscription est simple, accessible à tous et en 5 minutes l\u0026rsquo;espace de stockage est dispo. Il est accessible de plein des manières, comme du borg backup en version 1.2, du ssh et du webdav.\nPour le sftp (ou ssh) il faut changer le port par défaut, pour le port 23. La doc est très bien faite.\nQue faire alors pour changer ma configuration et faire des sauvegardes, toujours via restic ?\nLa première étape c\u0026rsquo;est de copier votre clé ssh sur le storage boxe pour avoir une connexion sans mdp :\ncat .ssh/id_ed25519.pub | ssh -p23 u3297xx@u3297xx.your-storagebox.de install-ssh-key Puis dans le configuration.nix on ajoute la configuration de connexion pour le /etc/ssh/ssh_config\nprograms.ssh.extraConfig = \u0026quot;Host u3297xx.your-storagebox.de\\n Hostname u3297xx.your-storagebox.de\\n Port 23\\n user u3297xx\\n IdentityFile /home/alexandre/.ssh/id_ed25519\u0026quot;; Seconde étape la configuration de restic, ou l\u0026rsquo;on passe d\u0026rsquo;un localbackup à un remote, soit :\nremotebackup = { initialize = true; # crée le repo s'il existe pas passwordFile = \u0026quot;/run/restic_pass\u0026quot;; # mot de passe pour accéder au repo, voir article précédent paths = [ \u0026quot;/var/lib/nextcloud/data/\u0026quot; \u0026quot;/var/backup/postgresql\u0026quot; ]; # ce que nous allons sauvegarder repository = \u0026quot;sftp:u329746@u329746.your-storagebox.de:/home/Nextcloud\u0026quot;; # ou se fait la sauvegarde, ici dans un dossier Nextcloud sur le storage boxe # Configuration de la périodicité des sauvegardes, cela cré un timer timerConfig = { OnCalendar = \u0026quot;02:05\u0026quot;; RandomizedDelaySec = \u0026quot;5h\u0026quot;; }; }; Un petit sudo nixos-rebuild switch après et la sauvegarde est de nouveau opérationnelle, enjoy :-)\n","date":"2022-12-15T00:00:00Z","permalink":"https://atlanticaweb.fr/p/2022/12/15/faire-ses-sauvegardes-dans-un-storage-boxe-de-chez-hetzner/","title":"Faire ses sauvegardes dans un storage boxe de chez Hetzner"},{"content":"L\u0026rsquo;objectif de ce post est d\u0026rsquo;avoir une doc sur la génération d\u0026rsquo;un template de VM pour Proxmox.\nNous allons voir toutes les étape pour générer un fichier de VM Nixos, l\u0026rsquo;inclure dans Proxmox, le personnaliser et le transformer en template réutilisable.\nCréer une image à intégrer à Proxmox La première étape consite à créer sur son poste un image de VM au format Proxmox\nnix --extra-experimental-features nix-command --extra-experimental-features flakes run github:nix-community/nixos-generators -- --format proxmox Cette commande va générer un fichier dans le store de nix. Elle est extremement basique. Elle démarre et il y a un simple compte root sans mot de passe.\nCopier l\u0026rsquo;image générée sur le proxmox :\nscp /nix/store/6c6n1lrdc30mk6fd9d5rbhiyba8inm0c-proxmox-nixos-22.05.3010.dd1f4d98244/vzdump-qemu-nixos-22.05.3010.dd1f4d98244.vma.zst root@192.168.10.112:/var/lib/vz/dump/ Maintenant que l\u0026rsquo;image est sur notre Proxmox on peut la supprimer :\nnix --extra-experimental-features nix-command store gc Transformer un fichier image en template dans Proxmox Maintenant que notre image est sur notre serveur Proxmox, nous allons créer une VM :\nqmrestore /var/lib/vz/dump/vzdump-qemu-nixos-22.05.3010.dd1f4d98244.vma.zst 101 --unique true Note : cloud-init peut être activé via : services.cloud-init.network.enable = true;\nA partir de là, nous pourrions transformer cette VM en template, mais comme il est trop basique, on va la modifier. Vous pouvez la démarrer.\nLorsque la VM sera démarrée, le seul moyen d\u0026rsquo;y accéder c\u0026rsquo;est via la console, car le compte root ne possède pas de mot de passe.\nPerso je suis pas fan de la console série, donc je défini un mot de passe à root, puis je me connecte à la VM en SSH. On supprimera le mot de passe plus tard.\nCustomisation de la VM Comme vous l\u0026rsquo;aurez remarqué, la VM ne possède pas de dossier /etc/nixos c\u0026rsquo;est brut.\nOn va le générer :\nnixos-generate-config Attention par defaut ssh est désactivé.\nJ\u0026rsquo;ai un dépôt avec une config de \u0026ldquo;base\u0026rdquo;, comme les packets que j\u0026rsquo;aime retrouver sur une VM ou simplement mon compte utilisateur :\nnix-shell -p git --run git clone https://git.atlanticaweb.fr/alexandre/nixos-template-PX.git Après avoir apporté vos configurations de base, on fait le ménage et on éteint la VM:\nrm -rf nixos-template-PX passwrd -d root nix-collect-garbage -d poweroff Transformation de la VM Maintenant que notre modèle est terminé, on peut le transformer en template et supprimer l\u0026rsquo;image dans /var/lib/vz/dump/\nNouvelle VM Le disque par défaut fait que 2Go, ci-dessous les commandes, pour rappel, pour l\u0026rsquo;agrandir (après avoir configuré la nouvelle VM et lui avoir attribué un disque plus grand):\nparted /dev/vda resizepart 1 100% quit resize2fs /dev/vda1 ","date":"2022-10-13T00:00:00Z","permalink":"https://atlanticaweb.fr/p/2022/10/13/nixos-faire-une-image-pour-proxmox/","title":"Nixos : faire une image pour Proxmox"},{"content":"J\u0026rsquo;ai quelques tickets restaurant à trier et déposer au CRT. Le problème c\u0026rsquo;est qu\u0026rsquo;il faut leur donner le nombre exact et le montant.\nC\u0026rsquo;est long et fastidieux. J\u0026rsquo;ai une douchette à code barres, ça va être moins long et moins fastidieux :-)\nDans le code barre, le montant est \u0026ldquo;hardcodé\u0026rdquo; entre le 13ème et le 16ème caractères. Il suffit donc de : - scanner chaque ticket avec la douchette et renvoyer le tout dans un fichier - extraire le chiffre entre la 13ème et le 16ème caractère inclus - ajouter un point entre les 2 - faire la somme\nmon onliner pour faire ça :\nawk '{ print substr($0,13,4)}' TR.txt|awk '{ sub(/[0-9][0-9]/,\u0026quot;\\\u0026amp;.\u0026quot;)}1'|awk '{print $1; s+=$1} END {print \u0026quot;Total :\u0026quot; s \u0026quot; Nombre de TR : \u0026quot; NR \u0026quot; Pour une moyenne de : \u0026quot; s / NR \u0026quot;€\u0026quot;}' ","date":"2022-09-11T11:48:56+02:00","permalink":"https://atlanticaweb.fr/p/2022/09/11/pr%C3%A9parer-un-d%C3%A9pot-de-tickets-restaurant/","title":"Préparer un dépot de tickets restaurant"},{"content":"nix-shell et dotenv Pour mes besoins de gestion, je souhaite me développer de quoi alimenter une base de données PostgreSQL. Rien de très compliqué, mais qui va me faire gagner du temps et me permettre d\u0026rsquo;assurer le pilotage de mes affaires.\nJe suis pas développeur, je connais rien aux css et et pas plus au js.\nMais je sais de quoi j\u0026rsquo;ai besoins. Il y a longtemps que j\u0026rsquo;aurai du me mettre à faire un peu de dev. Je vais pas devenir un ténor, mais au moins je serai capable d\u0026rsquo;avancer en autonomie.\nPar ou commencer ? Quel language est le plus simple à prendre en main, pour aller à l\u0026rsquo;essentiel (le service que va me rendre l\u0026rsquo;application) et une bonne intégration/usage avec mon poste de travail ?\nAprès une rapide étude et quelques tests :\nPhp : certainement très bien, mais php n\u0026rsquo;est pas trop utilisé en dehors du web, et j\u0026rsquo;accroche pas à son fonctionnement. Ruby : superbe language, mais les gem c\u0026rsquo;est toujours la merde. J\u0026rsquo;ai voulu installer la gem rails et paff ça plante sur la compilation d\u0026rsquo;un module. Classique mais pénible. Python : ça ressemble à une piste valable. J\u0026rsquo;ai tjs lutter contre mais faut pas être c.. on va donc essayer. Plus particulièrement, il y a le framework Flask qui est réputé simple et rapide à prendre en mains. Mise en place des briques Au quotidien, j\u0026rsquo;utilise fish comme shell, mais il y a quelques problèmes car le standard est bash. Ici le vrai problème que j\u0026rsquo;ai rencontré, c\u0026rsquo;est dans l\u0026rsquo;utilisation du serveur http intégré de Flask. Avec fish, il plante, avec bash tout va bien.\nOn va donc faire en sorte de lancer le serveur de développement, en étant sous bash.\nCréation d\u0026rsquo;un environnement de développement La solution miracle se nomme nix-shell. Dans ce qui va devenir notre répertoire de développement, on crée le fichier default.nix suivant :\nwith import\u0026lt;nixpkgs\u0026gt; {}; stdenv.mkDerivation rec { name = \u0026quot;env\u0026quot;; env = buildEnv { name = name; paths = buildInputs; }; buildInputs = [ python3 python39Packages.flask ]; } Dans ce fichier on crée une dérivation nommée rec constituées des paquets python3 et python39Packages.flask. La dérivation va nous créer un environnement avec python39 et flask. On peut y ajouter tout ce dont on a besoins, comme le moteur de la bdd PostgreSQL (ce qu\u0026rsquo;on fera plustard dans le projet)\nComme je suis faignant, je vais utiliser un fichier .envrc pour charger automatiquement mon nix-shell. On ajoute donc la ligne suivante dans le fichier .envrc :\nuse_nix On oubli pas d\u0026rsquo;autoriser le chargement du fichier .envrc via la commande :\ndirenv allow Vous devriez maintenant avoir l\u0026rsquo;environnement de dispo\nCréation et chargement de l\u0026rsquo;environnement La création de l\u0026rsquo;environnement virtuel python est classique :\npython -m venv ~/virtualenv/.flask-app Pour le charger, il suffit de faire, avec Fish :\nsource ~/virtualenv/.flask-app/bin/activate.fish Avec Bash :\nsource ~/virtualenv/.flask-app/bin/activate A partir de maintenant vous pouvez commencer à utiliser pip et flask\nOn peut pas avoir un chargement automatique ? Par exemple, on entre dans le dossier et paf, ça charge le virtualenv, et on met à jour les modules via pip ?\nTout d\u0026rsquo;abord, si comme moi vous utilisez fish il faut s\u0026rsquo;assurer d\u0026rsquo;avoir dans le fichier ~/.config/fish/config.fish la ligne suivante :\ndirenv hook fish | source Si vous utilisez bash, vous ajoutez à votre .bashrc :\neval \u0026quot;$(direnv hook bash)\u0026quot; ligne est nécessaire pour charger automatiquement le script activate.fish. Sans cette ligne vous aurez une erreur 2.\nNotre fichier default.nix ressemble maintenant à ça :\nwith import\u0026lt;nixpkgs\u0026gt; {}; stdenv.mkDerivation rec { name = \u0026quot;env\u0026quot;; env = buildEnv { name = name; paths = buildInputs; }; venvDir = \u0026quot;./.venv\u0026quot;; buildInputs = [ python3 python39Packages.flask ]; shellHook = '' source \u0026quot;${venvDir}/bin/activate\u0026quot; #pip install -r requirements.txt export FLASK_APP=hello export FLASK_ENV=developpement ''; } Normalement, dès que vous entrez dans le dossier, le virtualenv est chargé, les variables d\u0026rsquo;environnement aussi et vous pouvez tester votre nouvelle application avec un simple :\nflask run Si vous avez besoins de modules via pip, il suffit de décommenter la ligne commençant par pip et de renseigner le fichier requirements.txt. Les modules seront automatiquement installés.\nReste plus qu\u0026rsquo;a mettre l\u0026rsquo;ensemble dans un dépôt git et à vous concentrer sur votre application.\n","date":"2022-09-01T00:00:00Z","permalink":"https://atlanticaweb.fr/p/2022/09/01/nixos-d%C3%A9velopper-une-application-python-flask-avec-nix-shell/","title":"Nixos - développer une application python flask avec nix-shell"},{"content":"Dans le monde de l\u0026rsquo;IT, Grafana est très connu pour ses capacités de visualisation de données de supervisions.\nIl est généralement couplé à Prometheus ou à Influxdb.\nCette hégémonie dans la représentation des données systèmes, cache - un peu - un autre usage : la représentation de données diverses, comme des données commerciales.\nGrafana est un outil de consultation, de transformation et de visualisation de données. C\u0026rsquo;est un outil libre, gratuit qui fonctionne avec des données temporelles. A partir de sources de données, il vous simplifie leur représentation graphique, y compris en y applicant des calculs ou transformations. Il fonctionne comme un serveur web.\nLa partie visualisation est basée sur des dashboards\nLa partie source peut-être un fichier csv, une base temporelle, ou une base de données relationnelle, mais pas que.\nSans offrir la capacité de transformation/manipulation d\u0026rsquo;un outil comme R, Grafana est en mesure de vous accompagner dans votre gestion commerciale quotidienne, que vous soyez une petite entreprise ou une PME.\nPourquoi Grafana est une piste pour vous accompagner dans votre gestion commerciale ? Pourquoi ne pas utiliser directement un ERP ? Pourquoi ne pas rester sur mon fichier xls que j\u0026rsquo;utilise depuis des années ? Un ERP vous affiche des données jugées interessantes par son concepteur, pas par vous. Un fichier xls en 2022, c\u0026rsquo;est tout sauf utile, vous passez juste à côté de la richesse de vos données et de votre entreprise. Cet usage est malheureusement trop courrant encore aujourd\u0026rsquo;hui.\nCes différences sont de taille, car si effectivement voir l\u0026rsquo;évolution de son CA est importante, savoir si la vente de pulls rouge sur le magasin de Lyon est rentable, est certainement plus opportun comme de connaitre la période ou vous êtes principalement sollicité pour installer des batteries. Ou encore de déterminer qu\u0026rsquo;un acheteur de prestation grafana vous restera fidèle dans son hébergement web, plus longtemps qu\u0026rsquo;un autre ;-)\nDans les agences web, comme chez votre infogéreurs, il est possible d\u0026rsquo;acheter du crédit temps pour de la prestation. Aussi vous pouvez certainement faire développer pour un cout maitrisé des dashboard adaptés à votre buisness, et ça c\u0026rsquo;est aussi important.\nDans la suite de cet article, je vais vous illustrer un usage appliqué à des données issues d\u0026rsquo;une caisse en ligne : hiboutik\nhiboutik est une application web de type caisse enregistreuse. Cette application, non libre, permet de gerer une caisse, ou des tables pour un restaurant. Vous avez la possibilité d\u0026rsquo;avoir plusieurs points de ventes, plusieurs vendeurs, des déclinaisons d\u0026rsquo;articles, d\u0026rsquo;afficher des grafiques de vos données plus ou moins pertinents etc\u0026hellip; Là ou cette webapp se démarque de la concurrence, c\u0026rsquo;est que vos données sont accessibles via une API, et téléchargeable au format csv\nGrafana est capable de lire du csv, mais cela limite l\u0026rsquo;interêt du produit. Je vous conseille d\u0026rsquo;importer vos csv dans une base PostgreSQL, vous profiterez du language SQL pour filtrer et analyser vos résultats. Le SQL étant un language très répendus, il sera toujours possible de faire évoluer vos dashboard par différents partenaires. Votre entreprise profitera de ses investissements aussi longtemps qu\u0026rsquo;elle existera, car ils ne seront pas soumis à votre prestataire du moment : le dashboard vous appartient, la données aussi, et le language SQL est un standard : combo gagnante.\nLa requète SQL la suivante vous permez de suivre le volume par mois des ventes de Pulls.\nSELECT DATE_TRUNC('month',date_creation) AS \u0026quot;time\u0026quot;, count(Libellé) AS Pull FROM detail_ventes WHERE Libellé like 'Pull' group by DATE_TRUNC('month',date_creation)\nSi vous ajoutez la requète suivante à votre timeline, vous verrez le meilleur mois pour faire la promotion des pulls et des jeans et ainsi qugmenter votre panier moyen SELECT DATE_TRUNC('month',date_creation) AS \u0026quot;time\u0026quot;, count(Libellé) AS Jean FROM detail_ventes WHERE Libellé like 'Jean' group by DATE_TRUNC('month',date_creation)\nOn peut ainsi obtenir les grafiques suivants : ","date":"2022-07-17T00:00:00Z","permalink":"https://atlanticaweb.fr/p/2022/07/17/grafana-un-assistant-pour-tout/","title":"Grafana un assistant pour tout"},{"content":"Quand on met sa configuration système en ligne, encore plus quand on utilise git/gitea/gitlab/github, la gestion des secrets est importante.\nComment stocker un mot de passe sans le refiler à toute la terre ?\nIl existe un projet libre, nommé age qui permet de chiffrer un fichier à partir de sa clé GPG ou SSH\nJe n\u0026rsquo;utilise pas GPG pour plein de raisons. Par contre j\u0026rsquo;utilise SSH :)\nSous nixos, on dispose d\u0026rsquo;un outil qui utilise age, il s\u0026rsquo;agit de agenix\nagenix va déchiffrer le fichier age que nous aurons généré (celui qui est stocké dans git) en un fichier que nous aurons choisi. Le contenu sera alors en clair sur le système, lisible en fonction des droits qu\u0026rsquo;on aura défini.\nSur la page github, il y a un tutorial, mais lors de la mise en oeuvre, il m\u0026rsquo;a manqué quelques informations. Le but de se billet, est donc de voir la mise en place de la solution.\nInstallation La documentation officielle est limpide à ce sujet. Moi j\u0026rsquo;ai opté pour l\u0026rsquo;installation nix-channel qui est plus proche de mes setups. Je utilise ni niv ni flakes\nPour paraphraser la documentation, il suffit d\u0026rsquo;ajouter le dépot et de mettre à jour le référentiel :\nsudo nix-channel --add https://github.com/ryantm/agenix/archive/main.tar.gz agenix sudo nix-channel --update Pour chiffrer le fichier, nous avons besoins de l\u0026rsquo;utilitaire agenix et pour que le système déchiffre le fichier, il a besoin du module. Il n\u0026rsquo;est pas nécessaire d\u0026rsquo;avoir les 2 sur le même poste. Seul le module est, bien sur, obligatoire.\nPour installer le module, il faut ajouter au fichier configuration.nix dans la zone d\u0026rsquo;import : \u0026lt;agenix/modules/age.nix\u0026gt;\nPour installer le programme il faut ajouter la ligne suivante n\u0026rsquo;import ou :\nenvironment.systemPackages = [ (pkgs.callPackage \u0026lt;agenix/pkgs/agenix.nix\u0026gt; {}) ]; Ou vous pouvez centraliser comme moi, la gestion de vos secrets dans un fichier agenix.nix qui sera lui-même importé dans le configuration.nix\n` { pkgs, ... }: { imports = [ \u0026lt;agenix/modules/age.nix\u0026gt; ]; environment.systemPackages = [ (pkgs.callPackage \u0026lt;agenix/pkgs/agenix.nix\u0026gt; {}) ] age.secrets.secret_restic = { file = ./secrets/secret_restic.age; path = \u0026quot;/run/restic_pass\u0026quot;; owner = \u0026quot;restic\u0026quot;; group = \u0026quot;restic\u0026quot;; }; } ` Comme on peut le voir, j\u0026rsquo;ai définit une variable age.secrets.secret_restic qui contient le chemin relatif vers le fichier chiffré, le path du fichier non chiffré, son owner et son groupe d\u0026rsquo;appartenance.\npath, owner et group sont facultatifs.\nPar défaut, agenix déchiffre dans /run/agenix.d/xx/secret_restic ou xx correspond à un nombre et représente la génération. Ce nombre varie à chaque appel de nixos-rebuild switch on comprend assez facilement l\u0026rsquo;interet de définir une copie fixe qui sera dans path\nowner et group permettent de donner le droit à accéder au secret à des comptes précis.\nIl nous reste à voir la génération du fichier age et la configuration de ma sauvegarde.\nComment s\u0026rsquo;articule secrets.nix, GPG, SSH et agenix ? Nous avons 1 fichier age par mot de passe, et un fichier sercret.nix qui permet de définir quel clé SSH ou GPG peux déchiffrer le fichier age le tout dans un dossier secrets\nComme je souhaite utiliser une clé ssh, je dois déterminer quel clé est disponible :\nssh-keyscan 192.168.10.114 Attention, la commande nixos-rebuild ne va pas connaitre votre clé dans $HOME/.ssh mais va travailler à partir de /etc/ssh\nLe fichier secrets.nix Exemple d\u0026rsquo;un fichier secrets.nix ` let restic = \u0026quot;ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGgO3EpoG14fn0VYC69sSS0iI5ZEB4qx9adFS+L5U5ZB\u0026quot;; users_backup = [ restic]; in { \u0026quot;secret_restic.age\u0026quot;.publicKeys = users_restic; } ` Exemple avec une autre clé public ` let nextcloud-db = \u0026quot;ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKUA1RW6JwZasspAp8qmFRFnlV5WXjhLfStAAkM+KYLv\u0026quot;; restic = \u0026quot;ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGgO3EpoG14fn0VYC69sSS0iI5ZEB4qx9adFS+L5U5ZB\u0026quot;; users_backup = [ restic]; users_nextcloud = [ restic nextcloud-db ]; in { \u0026quot;secret_restic.age\u0026quot;.publicKeys = users_restic; \u0026quot;secret_nextclouddb.age\u0026quot;.publicKeys = users_nextcloud; } ` Subtilité ici, car le groupe users_nexcloud est constitué de restic et nextcloudb\non défini autant de variable que nous avons clés publics, ici il s\u0026rsquo;agit de nextcloud-db et restic on affecte le ou les comptes à des groupes. Ici le compte restic appartient au groupe users_backup et les comptes restic et nextcloud-db appartiennent au groupe users_nextcloud on définit quel groupe peux éditer/modifier quel fichier age. Donc ici le groupe users_restic peux déchiffrer/modifier/créer le fichier secret_restic.age et le groupe users_nextcloud (donc les détenteurs des clés publics attachés à nextcloud-db ainsi que restic) peut éditer/modifier/créer le fichier secret_nextclouddb.age Petite précision, on parle de user, mais nextcloud-db et restic ne sont pas des comptes utilisateur au sens unix, mais bien des variables qui permettent de nommée le détenteur de la clés public\nLorsque le fichier secrets.nix est créé, on peux générer nos fichiers age\nGénération du fichier age La génération du fichier age se fait donc après la création du fichier secrets.nix\nAgenix s\u0026rsquo;appuis sur ce fichier pour chiffrer et permettre aux différent comptes défini de modifier ou lire le fichier généré. Parfait pour le travail d\u0026rsquo;équipe.\nAinsi pour chiffrer ou modifier mon mot de passe :\nagenix -e secret_restic.age -i /etc/ssh/ssh_host_ed25519_key.pub Comme on l\u0026rsquo;a vu un peu plus haut, le fichier secrets, permet de déclarer des clés, de les associer à des comptes, ou variables. Ces comptes vont être intégrés à un groupe d\u0026rsquo;utilisateur et c\u0026rsquo;est au groupe que l\u0026rsquo;on donne l\u0026rsquo;autorisation de déchiffrer le fichier.\nEn d\u0026rsquo;autres termes, on va autoriser 1 ou plusieurs utilisateurs, à partir de leur clé SSH ou GPG, d\u0026rsquo;accèder au fichier age déchiffré.\nUtilisation dans le fichier backup.nix Dans le fichier ci-dessous, on peut voir que l\u0026rsquo;utilisation dans une configuration est transparente, et pour cause, le fichier age est déchiffré dans /run/restic_pass\n` {config, pkgs, ...}: { services.restic.backups = { localbackup = { initialize = true; passwordFile = \u0026quot;/run/restic_pass\u0026quot;; paths = [ \u0026quot;/var/lib/nextcloud/data/\u0026quot; ]; repository = \u0026quot;rest:https://back.atlanticaweb.fr/Nextcloud\u0026quot;; timerConfig = { OnCalendar = \u0026quot;00:05\u0026quot;; RandomizedDelaySec = \u0026quot;5h\u0026quot;; }; }; }; } ` Pour finir A partir de là, vous pouvez générer votre système avec nixos-rebuild \u0026ndash;switch Vos services vons pouvoir fonctionner avec des mots de passes aux accès réduits, et ces fichiers seront versionnés dans git, sans risque de compromission.\nVous pouvez retrouver le code complet ici\n","date":"2022-07-06T00:00:00Z","permalink":"https://atlanticaweb.fr/p/2022/07/06/g%C3%A9rer-ses-secrets-quand-on-utilise-git-et-quon-partage-son-code-et-nixos/","title":"Gérer ses secrets quand on utilise git et qu'on partage son code (et Nixos)"},{"content":"Kimsufi mais pas totalement Dans un précèdent article, on a parlé du script nixos-infect qui permet de remplacer un système existant par Nixos.\nMais parfois ça suffit pas. J\u0026rsquo;ai un serveur KS-16, et ce dernier ne boot pas quand j\u0026rsquo;utilise le script. Nous allons donc faire une installation manuelle.\nPour ce faire, je me suis basé sur la doc de https://mgdm.net/weblog/nixos-on-kimsufi/\nOn commence donc par booter en mode rescue.\nCe serveur possède 3 disques de 2To Je vais utiliser les disques en RAID 1. Cela me mettra à l\u0026rsquo;abris de la perte de 2 disques simultanées.\nOn commence par supprimer le volume logique lvremove /dev/vg/dat puis le VG vgremove vg puis le PV pvremove /dev/md127 puis on supprime le RAID existant dadm \u0026ndash;stop /dev/md125 mdadm \u0026ndash;stop /dev/md12 mdadm \u0026ndash;stop /dev/md127 Enfin on supprime les superblock des partitions existantes : mdadm \u0026ndash;zero-superblock /dev/sda2 mdadm \u0026ndash;zero-superblock /dev/sda3 Enfin on supprime la table des partitions wipefs -a /dev/sda\nPhase 2 : partitionnement Le disque sera partitionné en 3 parties. Une partition de boot en ext4 pour éviter toutes prises de tête, une seconde partition contenant tout l\u0026rsquo;espace disponible sauf 32Go et un swap de 32Go. Sur un PC de bureau et encore plus sur un laptop, je mets un swap équivalent à la RAM pour l\u0026rsquo;hibernation. Sur un serveur perso, 8Go c\u0026rsquo;est largement suffisant.\nOn commence par stocker dans des variables le nom de nos disques :\nDISK1=/dev/disk/by-id/ata-HGST_HUS724020ALA640_PN1134P6KV8PKW DISK2=/dev/disk/by-id/ata-HGST_HUS726020ALA610_N4G3SPDY DISK3=/dev/disk/by-id/ata-HGST_HUS726020ALA610_N4G3SR1Y Partionnement :\nparted /dev/sda -- mklabel msdos parted /dev/sda -- mkpart primary 1MiB 512MiB # /boot parted /dev/sda -- mkpart primary 512MiB -32GiB # / en ZFS parted /dev/sda -- mkpart primary linux-swap -32GiB 100% # swap On format la partition de boot, le raid et on charge le module zfs et on crée le spool ainsi que les partitions zfs\nmkfs.ext4 -L boot $DISK1-part1 mdadm --create /dev/md0 --level=0 --raid-devices=3 /dev/sda2 /dev/sdb2 /dev/sdc2 /sbin/modprobe zfs zpool create -f -O mountpoint=none rpool $DISK1-part2 zfs create -o mountpoint=legacy rpool/root zfs create -o mountpoint=legacy rpool/root/nixos Je n\u0026rsquo;ai pas besoins de partition pour /home je préfère avoir 1 seule partition racine. Maintenant que les partitions sont prêtes, on va les mounter et installer nixos.\nMount des partitions mount -t zfs rpool/root/nixos /mnt mkdir /mnt/boot mount $DISK1-part1 /mnt/boot Installation de Nixos sfdisk \u0026ndash;dump $DISK1 | sfdisk $DISK2 sfdisk \u0026ndash;dump $DISK1 | sfdisk $DISK3 maddm \u0026ndash;create /dev/md0 \u0026ndash;level=0 \u0026ndash;raid-devices=3 /dev/sda2 /dev/sdb2 /dev/sdc2 mkfs.ext4 -L nix /dev/md0\nchroot . /$INIT mount /dev/md0 /mnt mount /dev/sda1 /mnt/boot mkdir /mnt/boot nixos-generate-config \u0026ndash;root /mnt Editer /mnt/df\ncréation des répertoirs temporaires mkdir -p inst host/nix wget https://channels.nixos.org/nixos-21.11/latest-nixos-minimal-x86_64-linux.iso modprobe loop mount -o loop latest-nixos-minimal-x86_64-linux.iso inst apt install squashfs-tool unsquashfs -d host/nix/store inst/nix-store.squashfs \u0026lsquo;*\u0026rsquo; chroot . /$INIT mount -t zfs rpool/root/nixos /mnt mount /dev/sda1 /mnt/boot nixos-generate-config \u0026ndash;root /mnt NIX_PATH=\u0026ldquo;nixpkgs=channel:nixos-21.11\u0026rdquo; nixos-install passwd\n","date":"2022-05-26T00:00:00Z","permalink":"https://atlanticaweb.fr/p/2022/05/26/installation-de-nixos-sur-un-serveur-kimsufi/","title":"Installation de Nixos sur un serveur Kimsufi"},{"content":"Nixos et la doc ? Une fois entré dans l\u0026rsquo;univers de Nixos, la première chose qui m\u0026rsquo;a manqué c\u0026rsquo;est la documentation.\nLa lecture du wiki n\u0026rsquo;est pas facile quand on débute. La source première est bien souvent les dépôts git de ses utilisateurs, une merveille même.\nIl y a un côté assez frustrant, la documentation semble tellement manquée.\nPourtant, la documentation est complète et la lecture du code des paquets n\u0026rsquo;est pas très compliquée, on apprend vite à le comprendre.\nUn outil, magique, n\u0026rsquo;est pas suffisament mis en avant. Il s\u0026rsquo;agit de nixos-option. Cet outil est en réalité un indispensable. Il vous permettra de tout découvrir, et comment l\u0026rsquo;employer.\nVous souhaitez mettre en place une sauvegarde avec restic ? Vous cherchez la doc sur la création des comptes utilisateurs ?\nnixos-option users.users nixos-option services.restic.server nixos-option Exécutée sans argument, vous aurez la documentation racine. Libre alors de parcourir les catégories pour découvrir la doc associé, avec des exemples, et la liste des attributs à un mot clé et sa sous arborescence.\n","date":"2022-04-21T00:00:00Z","permalink":"https://atlanticaweb.fr/p/2022/04/21/nixos-de-la-documentation-bien-comme-il-faut-/","title":"Nixos de la documentation bien comme il faut :-)"},{"content":"Nixos sur serveur dédié Le choix d\u0026rsquo;une distribution est important. Non pas pour les applications packagées, mais pour la facilité d\u0026rsquo;installation et de maintenance. Sur un serveur, une distribution Rolling Release va créer de l\u0026rsquo;emplois : trop de travail régulier.\nCentos était un choix souvent fait pour la longévité de son support. Mais les montées de version n\u0026rsquo;existe pas. Debian est souvent un bon choix, communautaire, et pérenne. Mais ça demande aussi du travail.\nMais le suivi d\u0026rsquo;inventaire applicatif, devient vite pénible. L\u0026rsquo;approche Nixos, répond à toutes ces difficultés. Le problème, c\u0026rsquo;est son absence chez les hébergeurs. Pourtant, elle mérite qu\u0026rsquo;on s\u0026rsquo;y attarde. Heureusement, il existe un script nixos-infect\nnixos-infect va remplacer le système existant par une Nixos toute neuve. Le script fonctionne sur plusieurs plateforme VPS, et je l\u0026rsquo;ai testé sur un serveur Kimsufi.\nInstallation de Nixos sur un serveur dédié Kimsufi OVH ne propose donc pas Nixos parmis les 60 possibilités revendiquées sur la page d\u0026rsquo;accueil.\nPar contre on peut installer Debian 11 et profiter de l\u0026rsquo;outil pour faire le partitionnement des disques, puis transférer sa clé publique SSH sur le compte root\ncat ~/.ssh/id_ed25519-perso.pub |ssh root@37.187.xxx.8 'cat \u0026gt;\u0026gt; .ssh/authorized_keys' Enfin depuis notre nouveau serveur\ncurl https://raw.githubusercontent.com/elitak/nixos-infect/master/nixos-infect | NIX_CHANNEL=nixos-21.11 bash -x Et c\u0026rsquo;est tout. Y a pas plus simple pour avoir un système opérationnel :D\nIl reste plus qu\u0026rsquo;a supprimer l\u0026rsquo;ancienne fingerprint pour se reconnecter en SSH\nssh-keygen -f $HOME/.ssh/known_hosts -R 37.187.103.8 A partir de maintenant, vous pouvez enrichir votre configuration Nixos.\nVous trouverez ma configuration complète sur le git . Si vous l\u0026rsquo;utilisez, pensez à modifier la configuration SSH pour dans un premier temps autoriser les mots de passes, sinon, vous risquez de vous trouver à la porte.\nCette configuration utilise caddy comme serveur web (serveur plus rapide sur un site static que nginx et avec certificat SSL Lets\u0026rsquo;Encrypt intégré sans Certbot), avec export des metrics - caddy et systèmes.\nL\u0026rsquo;idéal étant de revoir l\u0026rsquo;ensemble pour l\u0026rsquo;intégrer à un système comme flake, deploy-rs ou nixops. Affaire à suivre\nIl reste plus qu\u0026rsquo;à mettre l\u0026rsquo;alerting et la sauvegarde en place. La partie sauvegarde concerne les dump de gitea qui sont pour l\u0026rsquo;instant dans un dossier local.\n","date":"2022-04-21T00:00:00Z","permalink":"https://atlanticaweb.fr/p/2022/04/21/nixos-partout-m%C3%AAme-l%C3%A0-bas/","title":"Nixos partout même là-bas"},{"content":"Les besoins ont changés, le matériel aussi. Exit les vieux disques sata, place à du neuf.\nLa configuration disque est basée sur un SSD de 128Go pour le système, et deux disque sata d'1To en RAID1 pour les VMs, et container.\nAprès avoir installé Proxmox 7.1 sur le SSD formaté en SSD, un peu de tunning:\nChanger la valeur du swapiness pour 90% au lieu de 60% sysctl vm.swappiness=90\nSupprimer les dépôts entreprise rm -f /etc/apt/sources.list.d/pve-enterprise.list\nAjout du dépot gratuit echo \u0026ldquo;deb http://download.proxmox.com/debian buster pve-no-subscription\u0026rdquo; \u0026raquo; /etc/apt/sources.list apt update\nCréation du zpool zpool create -f -o ashift=12 datastorez mirror /dev/sda /dev/sdb\nPuis dans Proxmox :\nStorage Add zpool id : D1 ZFS Pool: datastorez ","date":"2022-03-17T00:00:00Z","permalink":"https://atlanticaweb.fr/p/2022/03/17/proxmox-1-an-apr%C3%A8s/","title":"Proxmox 1 an après"},{"content":"Choix d\u0026rsquo;un gestionnaire à secrets La problématique du jour concerne la gestion des secrets, avec des questions du genre :\nQuelle solution pour stocker mes secrets (password, OTP) ? Faut-il stocker tout les secrets dans un seul et même endroit ? Est-ce que je dois utiliser un système avec mdp ? avec clé ? les 2 ? Est-ce que je vais partager des secrets avec plusieurs personnes ? Avec plusieurs pc ? PC + téléphone ? Mes critères étaient donc ceux-là :\nLe système doit être sufisament sûr pour les protéger mais pas trop complexe pour que des non informaticien puissent l\u0026rsquo;utiliser en cas de mort Le système ne doit pas être trop complexe pour que je sois en mesure de pouvoir l\u0026rsquo;utiliser en vieillissant Le système doit être sauvegardable Je dois pouvoir récupérer un mot de passe pour l\u0026rsquo;inclure automatiquement dans un fichier de configuration Je dois pouvoir l\u0026rsquo;utiliser en ligne de commande, avec mon navigateur et avec mon téléphone, le tout dans la même version/syncro Avec ces critères, j\u0026rsquo;ai repéré plusieurs solutions :\ngpg password-store keepass et ses dérivés vault bitwarden et ses forks J\u0026rsquo;ai rapidement exclu vault pour sa complexité de mise en oeuvre. J\u0026rsquo;ai pas assez de temps disponibles et je pense pas qu\u0026rsquo;à 90 ans je serai en capacité à maintenir cette solution\nLe deuxième éliminé est bitwarden (le fork, pas la solution originale). La solution est sympas, mais pareil, faut un serveur, et des compétences pour le maintenir, et en cas de mort ou dérivé, ça va être complexe.\npassword-store : j\u0026rsquo;ai aimé. Clairement ça répond à bcp de chose, et je pense que c\u0026rsquo;est clairement une solution au travail en équipe. gopass améliore l\u0026rsquo;expérience. Dans un contexte pro, je réfléchirai à son introduction. Je l\u0026rsquo;ai sorti, car sur du très long terme, je pense que c\u0026rsquo;est pas jouable, surtout pour avoir un tiers de confiance (non geek) en capacité à l\u0026rsquo;utiliser\nUne bonne lecture à ce sujet : https://github.com/fpco/best-practices/blob/master/password-store.md\ngpg : Bien mais ne supportera pas la perte de sa clé. J\u0026rsquo;ai trouvé que c\u0026rsquo;etait trop risqué et je parle pas de familiariser mon entourage à son usage.\nLa solution que j\u0026rsquo;ai retenu : KeepassXC. La GUI est plutot bien faite et l\u0026rsquo;outil viens avec l\u0026rsquo;utilitaire keepassx-cli qui permet d\u0026rsquo;avoir un mot de passe dans les fichiers de configuration, comme le mail.\nComment j\u0026rsquo;ai choisi de l\u0026rsquo;utiliser ? J\u0026rsquo;ai un fichier protégé par passphrase pour mes secrets, et j\u0026rsquo;ai une base keepass contenant 1 seul mdp pour une application en particulier.\nPar exemple une base mail qui est utilisé uniquement dans le fichier de configuration de mbsync. Cette base n\u0026rsquo;a pas de mdp, mais un fichier key. Ainsi pour l\u0026rsquo;ouvrir, il faudra avoir le fichier key (que je synchronise qqpart). En cas de perte, j\u0026rsquo;ai mon mdp dans ma base keepass globale. En cas de compromission, il n\u0026rsquo;y a que mes mails qui sont touchés.\nSans être ultime, je peux utiliser 1 base partagée entre mes pc et mon téléphone, avec un client lourd facile d\u0026rsquo;utilisation, en ligne de commande et dans mon navigateur. Ce qui manque à cette solution, c\u0026rsquo;est le suivi des modifications.\nUn plus : il est possible de faire un export de toute la base dans un fichier csv qu\u0026rsquo;on pourra stocker dans un coffre-fort. Sur le long terme, ça devrait le faire.\nExemple de création d\u0026rsquo;une base avec un fichier clé et ajout du secret, le tout en ligne de commande keepassxc-cli db-create -k $HOME/keys/emails.key $HOME/Keepass/emails.kbx chmod 0400 $HOME/keys/emails.key $HOME/Keepass/emails.kbx keepassxc-cli add -p --no-password -k $HOME/keys/emails.key $HOME/Keepass/emails.kbx emails Recupérer un mot de passe keepassxc-cli show -a Password --no-password -k $HOME/keys/emails.key $HOME/PRIVE/Keepass/emails.kbx emails ","date":"2022-02-07T11:48:56+02:00","permalink":"https://atlanticaweb.fr/p/2022/02/07/utiliser-keepassxc-dans-des-configurations/","title":"Utiliser keepassxc dans des configurations"},{"content":"Cette page est un mémo sur gpg, pour aider ma mémoire. Je mettrai certainement à jour cette page, selon mes usages.\nRSA ou ECC ? RSA est le format le plus répandu, mais il n\u0026rsquo;est pas le plus adapté aux environnement actuels.\nLe choix entre RSA et ECC se fait en fonction de votre environnement. Si vous utilisez des vieux trucs, il faut du RSA, sinon ECC sera parfait. Pour une sécurité équivalente, ECC nécessite une clé plus petite que RSA, et donc moins de cycle CPU, donc moins de ressources CPU consommées sur smartphone ou sur vieux pc ou équipements de faible puissance.\nCréation de la clé maitre Cette clée sera utilisée pour créer les sous clés, pour les révoquer ou pour augmenter leur durée de vie.\nFaut-il lui donner une durée de vie à la clé maître ? Perso, j\u0026rsquo;ai choisi d\u0026rsquo;avoir une date d\u0026rsquo;expiration d\u0026rsquo;un an pour ma clé Pro, et une date d\u0026rsquo;expiration proche de mon espérance de vie imaginaire pour ma perso.\nL\u0026rsquo;expiration sur la clé primaire n\u0026rsquo;est pas bloquant. Comme on utilise pas au quotidien la clé primaire, cela protège notre environnement en cas de perte, vol etc\u0026hellip; La date d\u0026rsquo;expiration d\u0026rsquo;une sous clé, empêche son utilisation. Il est facile de la prolonger.\nPuis-je supprimer une sous clée ? Oui ! Pour cela, il suffit de sélectionner la sous clé, puis on la supprime.\ngpg2 --list-keys gpg2 --edit-key --expert F136FE1BA10321C71D4D0646091E0FFD2A6E770F La sélection de clé se fait par la commande key suivi d\u0026rsquo;un numéro d\u0026rsquo;ordre. Le compteur commence à 0. 0 étant la clé maitre. Une clé apparait sélectionnée par l\u0026rsquo;adjonction du caractère ** * ** après ssb Pour supprimer les clés ainsi sélectionner il suffit de tapper la commande delkey\nPuis-je supprimer une clée maitre ? Lorsque l\u0026rsquo;on crée une nouvelle clée, on crée une partie public et une partie privée. Il faut d\u0026rsquo;abord supprimer la partie privée, puis la partie public :\ngpg --delete-secret-key F136FE1BA10321C71D4D0646091E0FFD2A6E770F gpg --delete-keys F136FE1BA10321C71D4D0646091E0FFD2A6E770F ou les 2 à la fois :\ngpg --delete-secret-and-public-key F136FE1BA10321C71D4D0646091E0FFD2A6E770F Ces commandes suppriment la clée primaire (public et privée) et les sous clés publics. Les sous clées privées restent présentent dans le répertoire .gnupg/private-keys-v1.d/\nIl faut également penser à supprimer l\u0026rsquo;ancien certificat de révocation :\nrm .gnupg/openpgp-revocs.d/F136FE1BA10321C71D4D0646091E0FFD2A6E770F.rev Les certificats de révocation sont automatiquement générés à la création de la clé ou de la sous-clé\nCréation de la clé maitre gpg2 --quick-generate-key 'Alexandre LUCAZEAU monmail@domaine.com' ed25519 cert 1y Ici on a créé une clée ellyptique du type ed25519 capable de certifier des sous clés et qui expire dans 1 an.\nCréation des clées secondaires On crée une sous-clée pour signer, une sous-clée pour chiffrer et une sous-clée pour l\u0026rsquo;authentification. Il m\u0026rsquo;arrive de devoir me connecter sur du matériel un peu ancien. J\u0026rsquo;ai donc une seconde sous-clé dédiée à l\u0026rsquo;authentification, mais en RSA4096\ngpg --quick-addkey F136FE1BA10321C71D4D0646091E0FFD2A6E770F ed25519 sign 1y gpg --quick-addkey F136FE1BA10321C71D4D0646091E0FFD2A6E770F ed25519 encr 1y gpg --quick-addkey F136FE1BA10321C71D4D0646091E0FFD2A6E770F cv25519 auth 1y gpg --quick-addkey F136FE1BA10321C71D4D0646091E0FFD2A6E770F rsa4096 auth 1y Mise en sécurité Notre clée primaire est la plus importante, c\u0026rsquo;est celle qui ne doit pas disparaitre ou être volée. La deuxième donnée importante, ce sont les certificats de révocation. Vous en aurez besoin en cas de compromission. La littérature sur internet conseil même d\u0026rsquo;imprimer sur papier les éléments.\nSauvegarde et suppression de la clé primaire Export de la clée privée et des sous clés : gpg --export-options backup --export-secret-keys $KEYID|gpg --symmetric \u0026gt; masterkey.key Suppression de la clée primaire, car elle n\u0026rsquo;est plus nécessaire sur notre poste : gpg --delete-secret-keys $KEYID Restauration et définition du niveau de confiance Test de restauration des clés privées Ce test est à faire avant toute exploitation de la clé ;-)\nDechiffrer notre masterkey.key en clé gpg gpg -o export.gpg -d masterkey.key Importer dans le trousseau gpg --import-options restore --import backup-cle-prive.gpg Définition du niveau de confiance de la clé Il est possible d\u0026rsquo;établir un niveau de confiance à la clé. Pour cela, il suffit de l\u0026rsquo;éditer, puis d\u0026rsquo;utiliser la commande trust et de valider le choix. 5 étant le niveau ultime.\nRévocation Générer un certificat de révocation pour la clé principale gpg --output revoke.asc --gen-revoke $KEYID Révoquer une sous clé Afficher les id des clés et de leurs sous clés :\ngpg --list-secret-keys --keyid-format LONG Editer la clée principale\ngpg --expert --edit-key \u0026lt;key-id\u0026gt; Sélectionner la sous clé à révoquer (par exemple la deuxième clé) et la révoquer\ngpg\u0026gt; key 2 gpg\u0026gt; revkey y gpg\u0026gt; quit Save changes (y/N) y gpg --list-secret-keys --keyid-format LONG ","date":"2022-01-26T00:00:00Z","permalink":"https://atlanticaweb.fr/p/2022/01/26/gpg-manuel-simplifi%C3%A9-dutilisation/","title":"gpg, manuel simplifié d'utilisation"},{"content":"Associer un fichier à un paquet { pkgs, ... }: { home = { packages = with pkgs; [ zathura ]; file.\u0026quot;.config/zathura/zathurarc\u0026quot;.source = ./zathurarc; }; } ","date":"2022-01-12T00:00:00Z","permalink":"https://atlanticaweb.fr/p/2022/01/12/associer-un-fichier-de-configuration-%C3%A0-linstallation-dun-paquet/","title":"Associer un fichier de configuration à l'installation d'un paquet"},{"content":"Garder une gestion propre et saine de ses dotfiles Sur la toile on peux trouver plétore de dossiers dotfiles contenant les fichiers de configurations divers.\nIl s\u0026rsquo;agit souvent de simple dépôt, plus ou moins en vrac. La gestion est plus ou moins facile.\nyadm est un outil libre qui va gérer pour vous ces fichiers, en s\u0026rsquo;appuyant sur git, capable d\u0026rsquo;utiliser gnupg ou openssl, par exemple, pour chiffrer vos secrets, et pour vous faciliter les sauvegardes régulières ou redéploiement des fichiers.\nPar ou commencer ? Il faut initialiser le dépot:\nyadm init Par défaut, cela crée le dépot dans /home/alexandre/.local/share/yadm/repo.git/\nPuis on remplit Pour ajouter un répertoire ou un fichier il suffit de faire\nyadm add .ssh yadm commit Vous l\u0026rsquo;aurez deviné, on peut faire plusieurs ajouts et 1 commit. La commande commit est identique à la fenetre à laquelle vous êtes habitué avec git, puisque c\u0026rsquo;est git qui est appelé.\nMise à jour ? Vous avez modifié un fichier ? Pour mettre à jour le dépot, il suffit de refaire un yadm add \u0026lt;mon_fichier\u0026gt; suivi de yadm commit\nTout mettre dans un dépot distant ? yadm remote add origin \u0026lt;url\u0026gt; yadm push -u origin master Pour mes secrets ? Vous posséder une clé ssh, ou un fichier de pawwsord ? Facile :\ncat 'mon_password_files' \u0026gt; ~/.config/yadm/encrypt cat 'mon_password_files2' \u0026gt; ~/.config/yadm/encrypt2 yadm encrypt Pour tout déchiffrer ? yadm decrypt Si je veux utiliser un autre répertoire pour mon dépot ? alias yadm='yadm --yadm-repo /home/alexandre/git/yadm' yadm init Petit retour yadm permet d\u0026rsquo;avoir des versions alternative d\u0026rsquo;un même fichier, en fonction de l\u0026rsquo;OS, du hostname, du user etc\u0026hellip; Perso je suis pas fan, je préfère avoir 1 dépot par personne/machine etc\u0026hellip;\nStocker dans un dépôt public mes fichiers sensibles ? Pas fan non plus. Par contre sur un dépot privé pourquoi pas. Mais attention, stocker dans un dépot chiffré une clé gpg privée, peux virer au cauchemard si il y a perte de la dite clé. Je suis pas persuadé qu\u0026rsquo;il s\u0026rsquo;agisse d\u0026rsquo;une bonne solution.\nDernière note yadm travail à partir de votre répertoire $HOME.\n","date":"2022-01-05T11:48:56+02:00","permalink":"https://atlanticaweb.fr/p/2022/01/05/gerer-ses-fichiers-de-configuration-via-un-d%C3%A9pot-git-et-lutilitaire-yadm/","title":"Gerer ses fichiers de configuration, via un dépot git et l'utilitaire yadm"},{"content":"A une époque, un logiciel libre nommé synergy permettait de partager le clavier et la souris entre plusieur PC, comme on pourrait le faire avec un KVM. Le partage d\u0026rsquo;écran et de ports USB en moins. Puis ce logiciel à supprimé sa doc, et est passé à un modèle totalement sous licence.\nBarrier est un fork de synergy, né de la dernière version libre de ce dernier.\nL\u0026rsquo;installation de barrier n\u0026rsquo;est pas aussi complète sous nixos que pour synergy\nIl vous faudra ouvrir le port 24800 et générer le certificat x509 nécessaire au chiffrement des communications\n$ cd ~/.local/share/barrier/SSL $ mkdir -p Fingerprints $ openssl req -x509 -nodes -days 365 -subj /CN=barrier -newkey rsa:4096 -keyout barrier.pem -out barrier.pem $ openssl x509 -fingerprint -sha1 -noout -in barrier.pem \u0026gt; Fingerprints/Local.txt $ sed -e \u0026quot;s/.*=//\u0026quot; -i Fingerprints/Local.txt ","date":"2022-01-05T11:48:56+02:00","permalink":"https://atlanticaweb.fr/p/2022/01/05/utiliser-un-kvm-logiciel-pour-passer-dune-machine-%C3%A0-une-autrre/","title":"Utiliser un KVM logiciel pour passer d'une machine à une autrre"},{"content":"Ce matin j\u0026rsquo;ai eu besoin de de transférer le contenu dans vieux dépôt git dans une branche d\u0026rsquo;un autre dépôt, distant.\nIl s\u0026rsquo;agit d\u0026rsquo;une simple opération d\u0026rsquo;archivage de code et de son historique. Le projet à évolué et le nouveau code est là et sur une nouvelle plateforme.\nJ\u0026rsquo;aime bien conserver l\u0026rsquo;histoire, on sait jamais.\nOn pourrait même imaginer avoir un dépot Archives et y placer dans des branches distinctes les anciens projets, et ainsi ne rien perdre, que ce soit le code, les commits etc..\nTout va s\u0026rsquo;opérer depuis le dépôt source\ncd git/mon_vieux_depot On se place dans la branche à transférer, mais ça peut être main\ngit checkout viellebranche On transfert les objet dans un dépot distant, dans une branche particulière (si on précise pas le nom de la branche, le transfert se fait dans master )\ngit push -u git@gitlab.com:mondepot.git old-20211006 Note : si old-20211006 n\u0026rsquo;existe pas, git va créé la branche distante\n","date":"2021-10-07T00:00:00Z","permalink":"https://atlanticaweb.fr/p/2021/10/07/git-pousser-une-branche-locale-dans-un-depot-distant/","title":"git : pousser une branche locale dans un depot distant"},{"content":"Contexte : je prépare un fichier csv généré par libreoffice. Les nombres utilises le caratère , et ma base attend .\n:SC 3=, Les virgules de la colonne 3 apparaissent en surbrillance. Pour les remplacer par un point il suffit de faire :\n:%s//./ Si on avait voulu supprimer toutes les lignes correspondant au schema de recherche :\n:g//d ","date":"2021-09-01T00:00:00Z","permalink":"https://atlanticaweb.fr/p/2021/09/01/vim-faire-un-changement-de-caract%C3%A8re-sur-un-r%C3%A9sultat-de-recherche/","title":"Vim : Faire un changement de caractère sur un résultat de recherche"},{"content":"Prélude Tout le monde le sait, avoir des backup c\u0026rsquo;est important. Mais comment procéder ? Que faut-il sauvegarder ? Avec quel outil ? Ou faire ses backups ? Comment superviser ses sauvegardes ? Avec quel mécanisme assurer la rotation, les logs etc\u0026hellip; ?\nNous allons donc aborder l\u0026rsquo;ensemble de ces points, apporter une réponse (mais pas LA réponse).\nCet article évoluera en fonction des besoins de sauvegardes. Il ne s\u0026rsquo;agit pas de mettre en place une solution d\u0026rsquo;entreprise, mais une solution personnelle pour un serveur dédié qui héberge des services.\nOn ne va donc pas assurer une sauvegarde globale, mais plutôt une sauvegarde par type de service.\nSinopsis de la solution créer un compte backup créer un groupe backup créer un répertoire backup appartenant au groupe backup forcer les droits des fichiers du répertoire pour qu\u0026rsquo;ils soient lisibles et supprimables par tous les membres du groupe backup pour chaque service créer un script de sauvegarde et un timer systemd pour sauvegarder localement un script de sauvegarde inclus un export des données vers un dépot restic distant, et la purge des fichiers mettre en place un mécanisme d\u0026rsquo;alerting en cas d\u0026rsquo;erreur de sauvegarde Les liens intéressant : pour une sauvegarde de gitea https://gist.github.com/sinbad/4bb771b916fa8facaf340af3fc49ee43 pour une sauvegarde de nextcloud https://help.nextcloud.com/t/rsync-to-cloud-storage-for-backups/43574\n","date":"2021-07-01T00:00:00Z","permalink":"https://atlanticaweb.fr/p/2021/07/01/backup-mettre-en-place-un-systeme-de-backup-complet/","title":"Backup : Mettre en place un systeme de backup complet"},{"content":"Quest-ce que c\u0026rsquo;est ? Cloud-init est une application de personnalisation d\u0026rsquo;une machine à son démarrage.\nCloud-init permet par exemple d\u0026rsquo;ajouter un utilisateur, de configurer un accès SSH avec une clée, installer des paquets, faire une configuration réseau en fonction du contexte etc\u0026hellip;\nCloud-init est un outil supporté par debian, Red-hat, mais également par les cloud providers tel qu\u0026rsquo;OVH, Amazon, Google etc\u0026hellip;\nComment ça se présente ? Cloud-init, c\u0026rsquo;est donc une application exécutée au premier lancement de la VM ou du container. L\u0026rsquo;application va lire un fichier de configuration, généralement appelé cloud-init.yaml\nCe fichier contient la personnalisation\nQuel lien avec Proxmox ? Proxmox supporte cloudinit. Une rubrique est même consacrée à Cloud-init, permettant de personnaliser depuis la webgui les quelques paramètres suivants :\n* user * Password * DNS domain * DNS servers * SSH puplic key * IP config On fait quoi alors ? L\u0026rsquo;idée est d\u0026rsquo;installer dans notre Proxmox, un template compatible cloud-init, qui sera utilisé pour créer de nouvelles VM. J\u0026rsquo;aime cloud-init pour les VM de base. Pour le reste, y a forman et puppet.\nDebian fournit une image cloud-init. C\u0026rsquo;est elle que nous allons récupérer et installer dans notre Proxmox et intégrer comme template\nLe tuto commence là La première étape consiste à récupérer On récupère l\u0026rsquo;image\nwget http://cdimage.debian.org/cdimage/openstack/current/debian-10-openstack-amd64.qcow2 On choisi un id pour notre vm\nID_VM=1024\nCréation de la VM avec 2G de RAM et une interface réseau connectée à notre bridge\nqm create ${ID_VM} --memory 2048 --net0 virtio,bridge=vmbr0\nImport de l\u0026rsquo;image disque dans la VM en spécifiant quel storage Proxmox utiliser (ici PX-DATA)\nqm importdisk ${ID_VM} debian-10-openstack-amd64.qcow2\nRattacher le nouveau disque à la VM, et quel bus système utiliser qm set ${ID_VM} --scsihw virtio-scsi-pci --scsi0 PX-DATA:${ID_VM}/vm-${ID-VM}-disqk-0.raw\nAjouter un lecteur cloudinit qm set ${ID-VM} --ide2 local:cloudinit\nDéfinir le disque de boot (ici notre image) qm set ${ID-VM} --boot c --bootdisk scsi0\nAjouter une interface vga pour accéder à la console qm set ${ID-VM} --serial0 socket --vga serial0\nTransformer la VM en template qm template ${ID-VM}\n","date":"2021-06-25T00:00:00Z","permalink":"https://atlanticaweb.fr/p/2021/06/25/utiliser-une-image-cloud-init-dans-proxmox/","title":"Utiliser une image cloud-init dans Proxmox"},{"content":"Nouvelle machine, ode à la joie Une nouvelle machine, c\u0026rsquo;est toujours cool. Ici il s\u0026rsquo;agit d\u0026rsquo;une bête, un HP 420 Workstation, avec un xeon 6 coeurs, 32Go de ram et disque d'1To.\nÇa fait une belle bête de labo, surtout si on y ajoute un SSD pour y installer Proxmox, et un second disque pour faire un RAID.\nCette viellerie, va devenir un chouette desktop.\nPour commencer faire le raid et l\u0026rsquo;intégrer à Proxmox L\u0026rsquo;ajout du second disque d'1To, va permettre de faire un volume LVM en Raid 1 pour y loger les VM et containers.\nEn résumé il faut : * Créer le volume groupe\npvcreate /dev/sda1 /dev/sdb1 * Créer le volume logique en mode raid 1 lvcreate -l 100%FREE --name data --type raid1 --nosync pve_data mkfs.xfs /dev/pve_data/data * Intégrer ce nouveau volume à Proxmox Dans Proxmox, Menu **Storage**, **Add**, **LVM**, Puis au niveau de **Base storage** choisir **Existing volume groups** et valider avec les éléments idouane * Utiliser Terraform pour le provisionning ou tester les outils de déploiement Nixos, à voir ","date":"2021-05-31T00:00:00Z","permalink":"https://atlanticaweb.fr/p/2021/05/31/nouveau-serveur-%C3%A0-la-maison/","title":"Nouveau serveur à la maison"},{"content":"Trier les photos d\u0026rsquo;un répertoire, par date exiftool \u0026quot;-Directory\u0026lt;DateTimeOriginal\u0026quot; -d \u0026quot;%Y/%Y-%m-%d\u0026quot; . ","date":"2021-04-02T00:00:00Z","permalink":"https://atlanticaweb.fr/p/2021/04/02/photos-simple-tips/","title":"Photos : simple tips"},{"content":"Analyse des ventes Dans une entreprise commerciale, il est souvent pertinent de suivre la vente d\u0026rsquo;une catégorie particulière. Ici nous allons nous intéresser à la vente des boissons à 20%\nLe modèle de données Le fichier csv qui sert de support est comme suit : jour,date,total.TTC.10,total.TTC.20\nLes dates sont au format JJ/MM/AAAA Exemple de données :\n1 jour,date,total TTC 10 %,total TTC 20 % 2 samedi,01/04/17,\u0026quot;458,5\u0026quot;,\u0026quot;7,6\u0026quot; 3 dimanche,02/04/17,\u0026quot;323,35\u0026quot;, 4 lundi,03/04/17,, 5 mardi,04/04/17,176, 6 mercredi,05/04/17,\u0026quot;289,6\u0026quot;,\u0026quot;6,8\u0026quot; 7 jeudi,06/04/17,\u0026quot;329,5\u0026quot;, Première étape : charger le fichier csv 1 Database \u0026lt;- read.csv(file.choose(), header = TRUE, sep= \u0026#34;,\u0026#34;, encoding=\u0026#34;UTF-8\u0026#34;) On vérifie la qualité du chargement :\nLes entêtes 1 2 \u0026gt; names(Database) [1] \u0026#34;jour\u0026#34; \u0026#34;date\u0026#34; \u0026#34;total.TTC.10..\u0026#34; \u0026#34;total.TTC.20..\u0026#34; Le nombre de colonnes et le nombre de lignes : 1 2 \u0026gt; dim(Database) [1] 365 4 On vérifie les premières lignes 1 2 3 4 5 6 7 8 \u0026gt; head(Database) jour date total.TTC.10.. total.TTC.20.. 1 samedi 01/04/17 458,5 7,6 2 dimanche 02/04/17 323,35 3 lundi 03/04/17 4 mardi 04/04/17 176 5 mercredi 05/04/17 289,6 6,8 6 jeudi 06/04/17 329,5 Sélectionner que les mardis : 1 subset(Database, Database$jour %in% \u0026#34;mardi\u0026#34;) Passer la colonne date au format YYYY-MM-DD Pour changer le format de la date on a besoin du package lubridate 1 2 3 install.packages(\u0026#39;lubridate\u0026#39;) library(lubridate) dmy(Database$date) Regrouper les lignes pour n\u0026rsquo;avoir qu\u0026rsquo;un cumul par mardi On a besoin de 2 paquets supplémentaires 1 2 3 4 install.packages(\u0026#34;magrittr\u0026#34;) # pour avoir accés à la fonction %\u0026gt;% library(magrittr) install.packages(\u0026#34;dplyr\u0026#34;) # pour avoir la fonction group_by library(dplyr) ","date":"2021-04-01T11:48:56+02:00","image":"https://atlanticaweb.fr/p/2021/04/01/r/R_logo_hu_defda323801e5c36.png","permalink":"https://atlanticaweb.fr/p/2021/04/01/r/","title":"R"},{"content":"TMUX Fiche pratique pour tmux\nLes sessions Démarrer une session : tmux Démarrer une session en mode 256 couleurs : tmux -2 Détacher une session : ^b d Démarrer tmux en détachant une session préalablement détachée : tmux attach Afficher la liste des sessions : tmux ls Afficher la liste des sessions depuis tmux : ^b s Les fenêtres Renommer une fenêtre : ^b , nomdelafenêtre Afficher la liste de fenêtres : ^b w Aller à la fenètre n°2 : ^b 2 Couper la fenêtre en 2 panneaux horizontaux : ^b\u0026quot; Couper la fenêtre en 2 panneaux verticaux : ^b % Renommer automatiquement la fenêtre en fonction du programme lancé : setw -g automatic-rename Faire un racourci pour aller à la précédente fenètre : bind-key C-a last-window En mode normal, vous ferez ^b ^a pour retourner à la précédente fenètre active. Les panneaux Fermer le panneau courant : ^b x Fermer tout les panneaux sauf celui où l\u0026rsquo;on est : ^b ! Aller au panneau suivant : ^b o Déplacer un shell vers l\u0026rsquo;autre panneau : ^b ^o Echanger la place de deux panneaux : entre le panneau courant et le suivant : ^b } entre le panneau courant et le précédent : ^b { Afficher l\u0026rsquo;heure dans un panneau : ^b t Afficher le numero de panneau : ^b q Maximiser/Restaurer le panneau actif : ^b z Revenir au precedent panneau actif : ^b ; Effectuer une recherche dans la fenetre Tmux stock l\u0026rsquo;affichage d\u0026rsquo;une fenêtre dans un buffer. Il est donc possible d\u0026rsquo;y effectuer des recherches. Il suffit de passer en mode copie (par defaut ctrl-b [ )\nChercher un motif en arrière : ? Chercher un motif en avant / Aller à l\u0026rsquo;occurence suivante : n Aller à l\u0026rsquo;occurence précédente : N Copier \u0026amp; Coller Mettre tmux en mode vi : set -g mode-keys vi\nMapper la touche esc à la place de la touche [ pour basculer en mode copie\nunbind [ bind Escape copy-mode Mapper la touche p en touche de coller le buffer\nunbind p bind p paste-buffer Affecte la touche v en mode début de la selection : bind-key -t vi-copy 'v' begin-selection\nAffecte la touche v en mode copie de la selection : bind-key -t vi-copy 'y' copy-selection\nLe workflow devient :\non entre en mode copie : Ctrl-b Escape déplacer le curseur vers la zone à sélectionner active la sélection : v déplacer le curseur sur l\u0026rsquo;ensemble du texte à copier copie dans le buffer la sélection : y coller la sélection: Ctrl-b p La barre On peut changer plusieurs choses, comme les couleurs.\nLa liste des couleurs disponible est : Color Black Red Green Yellow Blue Magenta Cyan White Changer la couleur de fond de la barre pour du noir : set -g status-bg Changer la couleur des caractères : set -g status-fg white Ajouter un affichage sur la gauche de votre barre : set -g status-left '#[fg=green]#H' On peut demander à tmux d\u0026rsquo;afficher le premier résultat d\u0026rsquo;une commande shell. Par exemple #(date)# Affichera le premier champ, le jour, que renvois la commande date, lorsque\u0026rsquo;elle est tappée dans un shell. On peux aussi choisir une des commandes prédéfinies dans tmux : #H équivaut au hostname de la machine locale On peux aussi spécifier des attributs particuliers, comme la couleur des caractères ou du fond (et ainsi les différencier du reste de la barre de status). Pour se faire il suffit de faire précéder la commande de #attribut=couleur Il est possible de configurer plusieurs attributs à la suite, en les séparant par une virgule. Afficher à gauche la date au format JJ/MM/AA en jaune et gras : set -g status-left '#[fg=yellow,bold]#(date '+%d/%m/%Y')'\nMettre en rouge la fenètre active set-window-option -g window-status-current-bg red\nIl est possible d\u0026rsquo;avoir la même chose mais du côté droit: set status-left (...)\nAfficher un message lorsqu\u0026rsquo;une fenêtre évolue (s\u0026rsquo;il y a de l\u0026rsquo;activité par chez elle). On va faire ça en deux étape. La première on va demander à tmux de surveiller s\u0026rsquo;il y a du mouvement dans une de nos fenêtre : setw -g monitor-activity on Et ensuite on lui demande, le cas échéant de nous prévenir : set -g visual-activity on\nUtiliser un script shell pour initialiser une session tmux : 1 2 3 4 5 6 7 8 9 10 #!/bin/sh tmux new-session -d -s masession tmux new-window -t masession:1 -n \u0026#39;Server1\u0026#39; \u0026#39;ssh root@10.x.x.x\u0026#39; tmux new-window -t masession:2 -n \u0026#39;Server2\u0026#39; \u0026#39;ssh root@10.x.x.x\u0026#39; tmux new-window -t masession:3 -n \u0026#39;Server3\u0026#39; \u0026#39;ssh root@10.x.x.x\u0026#39; tmux select-window -t masession:1 tmux -2 attach-session -t masession tmux new-session -d -s masession : crée une nouvelle session tmux, nommée masession, et la détache immediatement. Elle se trouve donc en arrière plan. Les 3 commandes new-window(\u0026hellip;) crées 3 fenêtres dans la session tmux nommée masession, les nouvelles fenêtres sont nommées serveur1 2 et 3, et y exécutent une connexion ssh\ntmux select-window -t masession:1 : la fenêtre 1 de la session masession sera la session active\ntmux -2 attach-session -t masession : maintenant que notre environnement masession est initialisé, on va le rattacher à notre terminal en utilisant le mode 256 couleurs\nExécuter des commandes tmux L\u0026rsquo;option -g est utile uniquement lorsque l\u0026rsquo;on exécute la commande au sein de tmux, pour l\u0026rsquo;appliquer à l\u0026rsquo;ensemble des fenètres en cours.\n","date":"2021-04-01T11:48:56+02:00","permalink":"https://atlanticaweb.fr/p/2021/04/01/tmux-fiche-memo/","title":"Tmux : fiche memo"},{"content":"Hugo et bonnes pratiques Hugo est un générateur de site, simple, flexible et pratique.\nMais travailler proprement, c\u0026rsquo;est encore mieux.\nL\u0026rsquo;objectif de cette fiche c\u0026rsquo;est de réunir des bonnes pratiques sur l\u0026rsquo;organisation et les usages autour d\u0026rsquo;Hugo.\nAu terme de l\u0026rsquo;évolution de cet article, nous aurons un site dont le contenu est séparé du moteur, en intégration continue et en publication continue.\nPar ou on commence ? Hugo, c\u0026rsquo;est un simple binaire. On peut le mettre n\u0026rsquo;importe ou.\nCe type d\u0026rsquo;utilitaires en dehors de la distribution - binaires statiques, je les stocks dans un répertoire ~/bin et je modifie le PATH de mon shell.\nConfiguration, thèmes et contenu git pour les gouverner tous Chaque catégorie d\u0026rsquo;éléments à un cycle de vie différent, des accès différents, des règles de sauvegarde différents etc..\nle fichier de configuration du site évolue peu, les fichiers assets ont une vie différente du thème choisi la rédaction d\u0026rsquo;articles peut se faire à plusieurs, utiliser des branches, des MR ou pour les gros sites, des accès différents entre les personnes en charge du design et les rédacteurs est probable Il est donc important de les séparer autant que possible.\nJ\u0026rsquo;utilise un répertoire ~/git pour stocker tout mes dossiers gérés par git, ou les projets que je suis. Ça facilite les recherches, et mises à jour.\nAinsi, pour un site internet je vais avoir :\n~/git/atlanticaweb.fr ~/git/atlanticaweb.fr/themes/theme_en_sumodule ~/git/content_atlanticaweb.fr =\u0026gt; dossier contenant les pages et les posts du site gitignore Tout ne doit pas être géré par git. Un site Hugo génère des fichiers ressources et des fichiers constituant le site internet. Ces derniers étant construit à partir du dossier content nous avons aucune raison d\u0026rsquo;assurer un suivi.\nLe fichier gitignore se résume donc à :\nressource public sauvegardes La sauvegarde d\u0026rsquo;un site hugo, doit inclure les éléments suivants :\nrépertoire du site répertoire du contenu le binaire hugo qui à permis de générer le site Ce qui donne :\nInitialisation du repo\n~/bin/restic -r sftp:backup:/home/alexandre/backup/atlanticaweb.fr init\nSauvegarde du site\n/bin/restic -r sftp:backup:/home/alexandre/backup/site-atlanticaweb.fr backup \u0026ndash;exclude-if-present .git \u0026ndash;exclude .git ~/bin/hugo git/content-atlanticaweb.fr git/atlanticaweb.fr\nCe qui reste à faire Programmer la sauvegarde via systemd Mettre en place un linter pour le markdown Faire de l\u0026rsquo;intégration continue avec drone Faire notre politique de déploiement Automatiser la mise en place de tout ça via Bolt ","date":"2021-03-28T11:48:56+02:00","permalink":"https://atlanticaweb.fr/p/2021/03/28/hugo-bonnes-pratiques/","title":"Hugo - bonnes pratiques"},{"content":"","date":"0001-01-01T00:00:00Z","permalink":"https://atlanticaweb.fr/p/1/01/01/","title":""}]