/ hosts / immortal / postgres-migrate.nix
postgres-migrate.nix
 1  {
 2    config,
 3    pkgs,
 4    ...
 5  }: {
 6    environment.systemPackages = [
 7      (let
 8        # XXX specify the postgresql package you'd like to
 9        # upgrade to. Do not forget to list the extensions
10        # you need.
11        newPostgres = pkgs.postgresql_15.withPackages (pp: [
12          # pp.plv8
13        ]);
14      in
15        pkgs.writeScriptBin "upgrade-pg-cluster" ''
16          set -eux
17          # XXX it's perhaps advisable to stop all services
18          # that depend on postgresql
19          systemctl stop postgresql
20          export NEWDATA="/var/lib/postgresql/${newPostgres.psqlSchema}"
21          export NEWBIN="${newPostgres}/bin"
22          export OLDDATA="${config.services.postgresql.dataDir}"
23          export OLDBIN="${config.services.postgresql.package}/bin"
24          install -d -m 0700 -o postgres -g postgres "$NEWDATA"
25          cd "$NEWDATA"
26          sudo -u postgres $NEWBIN/initdb -D "$NEWDATA"
27  
28          sudo -u postgres $NEWBIN/pg_upgrade --old-datadir "$OLDDATA" --new-datadir "$NEWDATA" --old-bindir $OLDBIN --new-bindir $NEWBIN "$@"
29  
30  
31  
32  
33        '')
34    ];
35  }