diff --git a/systems/jeeves/scripts/zfs.sh b/systems/jeeves/scripts/zfs.sh index 6be2ecf..00fa331 100644 --- a/systems/jeeves/scripts/zfs.sh +++ b/systems/jeeves/scripts/zfs.sh @@ -22,6 +22,7 @@ sudo zfs create media/secure/github-runners -o compression=zstd-9 -o sync=disabl sudo zfs create media/secure/home_assistant -o compression=zstd-19 sudo zfs create media/secure/notes -o copies=2 sudo zfs create media/secure/postgres -o recordsize=16k -o primarycache=metadata +sudo zfs create media/secure/postgres-wal -o recordsize=32k -o primarycache=metadata -o special_small_blocks=32K -o compression=lz4 -o secondarycache=none -o logbias=latency sudo zfs create media/secure/services -o compression=zstd-9 sudo zfs create media/secure/share -o mountpoint=/zfs/media/share -o exec=off diff --git a/systems/jeeves/services/postgress.nix b/systems/jeeves/services/postgress.nix index 65cec48..525c4ba 100644 --- a/systems/jeeves/services/postgress.nix +++ b/systems/jeeves/services/postgress.nix @@ -5,6 +5,18 @@ in { networking.firewall.allowedTCPPorts = [ 5432 ]; + # Symlink pg_wal to a ZFS dataset on the special (metadata) vdev for fast WAL writes + systemd.services.postgresql.preStart = pkgs.lib.mkAfter '' + if [ ! -L "${vars.database}/postgres/pg_wal" ] && [ -d "${vars.database}/postgres/pg_wal" ]; then + echo "Moving pg_wal to ${vars.postgres_wal} and creating symlink..." + cp -a "${vars.database}/postgres/pg_wal/." "${vars.postgres_wal}/" + rm -rf "${vars.database}/postgres/pg_wal" + ln -s "${vars.postgres_wal}" "${vars.database}/postgres/pg_wal" + elif [ ! -e "${vars.database}/postgres/pg_wal" ]; then + ln -s "${vars.postgres_wal}" "${vars.database}/postgres/pg_wal" + fi + ''; + services.postgresql = { enable = true; package = pkgs.postgresql_17_jit; diff --git a/systems/jeeves/vars.nix b/systems/jeeves/vars.nix index c64a0c1..ae9a5fc 100644 --- a/systems/jeeves/vars.nix +++ b/systems/jeeves/vars.nix @@ -6,6 +6,7 @@ in { inherit zfs_media zfs_storage zfs_scratch; database = "${zfs_media}/database"; + postgres_wal = "${zfs_media}/postgres-wal"; docker = "${zfs_media}/docker"; docker_configs = "${zfs_media}/docker/configs"; home_assistant = "${zfs_media}/home_assistant";