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 and gdal libraries are also installed.
  • Run nix-shell --pure shell.nix to build and start postgresql_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.