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 develop
sera 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 connections
PostgreSQL autorise toutes les connexions locales sans mot de passe. En production, on peut modifier le fichiervar/pgdata/pg_hba.conf
et 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