3 minutes
Première utilisation de Nix et setup Postgres
Petite précision, c’est un setup sur Mac avec processeur ARM. La version de Nix est 2.29.1.
Setup Nix sur OSX
sh <(curl --proto '=https' --tlsv1.2 -L https://nixos.org/nix/install)
source ~/.zshrc
mkdir ~/.config/nix
echo "experimental-features = nix-command flakes" >> ~/.config/nix/nix.conf
Remarque: sur Ubuntu, l’installer avec
sh <(curl --proto '=https' --tlsv1.2 -L https://nixos.org/nix/install) --daemon.
Setup PG
Créer un fichier nix/flake.nix dans votre repo git et ajouter le contenu suivant:
Option 1
{
  description = "Environnement de développement PostgreSQL";
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
    flake-utils.url = "github:numtide/flake-utils";
  };
  outputs = { self, nixpkgs, flake-utils }: 
    flake-utils.lib.eachDefaultSystem (system:
      let
        pkgs = import nixpkgs { inherit system; };
      in {
        devShells.default = pkgs.mkShell {
          buildInputs = [
            pkgs.postgresql
          ];
          shellHook = ''
            export setup_postgres=${pkgs.postgresql}/bin/initdb
          '';
        };
      });
}
Option 2 (avec démarrage du serveur automatique)
Chaque fois que
nix developsera démarré dans votre repo dans le dossiernix, le shell va s’ouvrir avec PostgreSQL installé et il va automatiquement lancer le serveur PostgreSQL (si la base est initialisée).
{
  description = "Environnement de développement PostgreSQL";
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
    flake-utils.url = "github:numtide/flake-utils";
  };
  outputs = { self, nixpkgs, flake-utils }:
    flake-utils.lib.eachDefaultSystem (system:
      let
        pkgs = import nixpkgs { inherit system; };
      in {
        devShells.default = pkgs.mkShell {
          buildInputs = [
            pkgs.postgresql
          ];
          shellHook = ''
            export setup_postgres=${pkgs.postgresql}/bin/initdb
            # Démarrage automatique de PostgreSQL si le dossier est initialisé
            if [ -d "$PWD/var/pgdata/base" ]; then
              echo "⏳ Démarrage de PostgreSQL..."
              pg_ctl -D $PWD/var/pgdata -l $PWD/var/pglog start
            else
              echo "⚠️  PostgreSQL n'est pas encore initialisé. Lancez :"
              echo "   $setup_postgres $PWD/var/pgdata"
            fi
          '';
        };
      });
}
Option 3 (start & stop automatique à l’entrée et sortie de nix develop)
{
  description = "Environnement de développement PostgreSQL";
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
    flake-utils.url = "github:numtide/flake-utils";
  };
  outputs = { self, nixpkgs, flake-utils }:
    flake-utils.lib.eachDefaultSystem (system:
      let
        pkgs = import nixpkgs { inherit system; };
      in {
        devShells.default = pkgs.mkShell {
          buildInputs = [
            pkgs.postgresql
          ];
          shellHook = ''
            export setup_postgres=${pkgs.postgresql}/bin/initdb
            # Démarrage automatique si base initialisée
            if [ -d "$PWD/var/pgdata/base" ]; then
              echo "⏳ Démarrage de PostgreSQL..."
              pg_ctl -D $PWD/var/pgdata -l $PWD/var/pglog start
              # À la sortie du shell, arrêter PostgreSQL
              trap "echo '🛑 Arrêt de PostgreSQL...'; pg_ctl -D $PWD/var/pgdata stop" EXIT
            else
              echo "⚠️  PostgreSQL n'est pas encore initialisé. Lancez :"
              echo "   $setup_postgres $PWD/var/pgdata"
            fi
          '';
        };
      });
}
cd nix
nix develop
$setup_postgres $PWD/var/pgdata
/nix/store/smngl7zwd4mcz426w18p7lnx08m52im0-postgresql-17.5/bin/pg_ctl -D /Users/.../nix/var/pgdata -l logfile start
createdb olivier
Vérification (connexion à PG)
psql -h localhost -p 5432 -U $USER
Stopper le serveur PG
nix develop
pg_ctl -D $PWD/var/pgdata stop
Attention le serveur tourne en mode dev:
initdb: warning: enabling "trust" authentication for local connectionsPostgreSQL autorise toutes les connexions locales sans mot de passe. En production, on peut modifier le fichiervar/pgdata/pg_hba.confet changer trust en md5 pour obliger une authentification avec mot de passe
Incompatibilité Mac M2
NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM=1 nix develop --impure
Cleanup complet (pas uninstall)
nix store gc