This is a nix recipe for building and running postgresql-12 in a virtual nix environment.
-
Create your project folder and save the following file as
shell.nix
let nixpkgs = import (builtins.fetchTarball https://github.com/NixOS/nixpkgs/archive/20.03.tar.gz) { overlays = []; config = {}; }; in with nixpkgs; stdenv.mkDerivation { name = "postgres-env"; buildInputs = []; nativeBuildInputs = [ zsh vim geos gdal nixpkgs-fmt # postgres-12 with postgis support (postgresql_12.withPackages (p: [ p.postgis ])) ]; postgresConf = writeText "postgresql.conf" '' # Add Custom Settings log_min_messages = warning log_min_error_statement = error log_min_duration_statement = 100 # ms log_connections = on log_disconnections = on log_duration = on #log_line_prefix = '[] ' log_timezone = 'UTC' log_statement = 'all' log_directory = 'pg_log' log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' logging_collector = on log_min_error_statement = error ''; # ENV Variables LD_LIBRARY_PATH = "${geos}/lib:${gdal}/lib"; PGDATA = "${toString ./.}/.pg"; # Post Shell Hook shellHook = '' echo "Using ${postgresql_12.name}." # Setup: other env variables export PGHOST="$PGDATA" # Setup: DB [ ! -d $PGDATA ] && pg_ctl initdb -o "-U postgres" && cat "$postgresConf" >> $PGDATA/postgresql.conf pg_ctl -o "-p 5555 -k $PGDATA" start alias fin="pg_ctl stop && exit" alias pg="psql -p 5555 -U postgres" ''; }
Note:
- Here, the nix packages are installed from 20.03 release.
- Postgres is installed with PostGIS extension.
- Above postgres server runs with local configuration specified in
postgresConf
variable, use this to modify/add config for postgres. - All data is stored in project folder’s
.pg
directory, configured by$PGDATA
variable. $PGHOST
is configured to be same as$PGDATA
.geos
andgdal
libraries are also installed.
-
Run
nix-shell --pure shell.nix
to build and startpostgresql_12
in your virtual environment.Note:
- Postgres is running here on port:
5555
, so it won’t conflict with other Postgres server, if running. - Running this command multiple times won’t start multiple postgres server, since it is controlled by the lock file:
./.pg/postmaster.pid
- To exit the nix shell, run
fin
, this will stop the postgres server.
- Postgres is running here on port: