1
1
#! /usr/bin/env bash
2
2
3
- [ ! -z " $DEBUG " ] && set -x
4
-
5
- # first argument is the old version; a path 15 or 16
6
- if [[ $1 == /nix/store* ]]; then
7
- if [ ! -L " $1 /receipt.json" ] || [ ! -e " $1 /receipt.json" ]; then
8
- echo " ERROR: $1 does not look like a valid Postgres install"
3
+ [ ! -z " $DEBUG " ] && set -eoux pipefail
4
+
5
+ # Function to build flake and return the output path
6
+ build_flake () {
7
+ local flake_url=" $1 "
8
+ local temp_dir=$( mktemp -d)
9
+ if ! nix build " $flake_url " -o " $temp_dir /result" ; then
10
+ echo " ERROR: Failed to build flake $flake_url "
9
11
exit 1
10
12
fi
11
- OLDVER=" $1 "
12
- elif [ " $1 " == " 15" ]; then
13
- PSQL15=@PSQL15_BINDIR@
14
- OLDVER=" $PSQL15 "
15
- elif [ " $1 " == " 16" ]; then
16
- PSQL16=@PSQL16_BINDIR@
17
- OLDVER=" $PSQL16 "
18
- else
19
- echo " Please provide a valid Postgres version (15 or 16), or a /nix/store path"
20
- exit 1
21
- fi
13
+ echo " $temp_dir /result"
14
+ }
22
15
23
- # second argument is the new version; 15 or 16
24
- if [[ $2 == /nix/store* ]]; then
25
- if [ ! -L " $2 /receipt.json" ] || [ ! -e " $2 /receipt.json" ]; then
26
- echo " ERROR: $1 does not look like a valid Postgres install"
27
- exit 1
28
- fi
29
- NEWVER=" $2 "
30
- elif [ " $2 " == " 15" ]; then
31
- PSQL15=@PSQL15_BINDIR@
32
- NEWVER=" $PSQL15 "
33
- elif [ " $2 " == " 16" ]; then
34
- PSQL16=@PSQL16_BINDIR@
35
- NEWVER=" $PSQL16 "
36
- echo " NEWVER IS $NEWVER "
37
- else
38
- echo " Please provide a valid Postgres version (15 or 16), or a /nix/store path"
39
- exit 1
40
- fi
16
+ # First argument is the old version flake URL
17
+ OLDVER=$( build_flake " $1 " )
18
+
19
+ # Second argument is the new version flake URL
20
+ NEWVER=$( build_flake " $2 " )
41
21
42
- # thid argument is the upgrade method: either pg_dumpall or pg_ugprade
22
+ # Third argument is the upgrade method: either pg_dumpall or pg_upgrade
43
23
if [ " $3 " != " pg_dumpall" ] && [ " $3 " != " pg_upgrade" ]; then
44
24
echo " Please provide a valid upgrade method (pg_dumpall or pg_upgrade)"
45
25
exit 1
46
26
fi
47
27
UPGRADE_METHOD=" $3 "
48
28
49
- echo " Old server build: PSQL $1 "
50
- echo " New server build: PSQL $2 "
29
+ echo " Old server build: $OLDVER "
30
+ echo " New server build: $NEWVER "
51
31
echo " Upgrade method: $UPGRADE_METHOD "
52
32
53
- PORTNO=" ${2 :- @ PGSQL_DEFAULT_PORT@ } "
33
+ PORTNO=" @PGSQL_DEFAULT_PORT@"
54
34
DATDIR=$( mktemp -d)
55
35
NEWDAT=$( mktemp -d)
36
+ PGUSER=${PGUSER:- postgres}
37
+ POSTGRES_PASSWORD=${POSTGRES_PASSWORD:- postgres}
38
+ PG_PROVE=@PG_PROVE@
39
+ PGUPGRADE_TESTS=@PGUPGRADE_TESTS@
56
40
mkdir -p " $DATDIR " " $NEWDAT "
57
41
58
- echo " NOTE: using temporary directory $DATDIR for PSQL $1 data, which will not be removed"
59
- echo " NOTE: you are free to re-use this data directory at will"
42
+ echo " using temporary directory $DATDIR for old data, which will not be removed"
43
+ echo " you are free to re-use this data directory at will"
60
44
echo
61
45
62
- $OLDVER /bin/initdb -D " $DATDIR " --locale=C
63
- $NEWVER /bin/initdb -D " $NEWDAT " --locale=C
46
+ echo " PGUSER IS $PGUSER "
47
+
48
+ $OLDVER /bin/initdb -U " $PGUSER " -D " $DATDIR " --locale=C
49
+ $NEWVER /bin/initdb -U " $PGUSER " -D " $NEWDAT " --locale=C
64
50
65
51
# NOTE (aseipp): we need to patch postgresql.conf to have the right pgsodium_getkey script
66
52
PSQL_CONF_FILE=@PSQL_CONF_FILE@
67
53
PGSODIUM_GETKEY_SCRIPT=@PGSODIUM_GETKEY@
68
- echo " NOTE: patching postgresql.conf files"
54
+ echo " patching postgresql.conf files"
69
55
for x in " $DATDIR " " $NEWDAT " ; do
70
56
sed \
71
57
" s#@PGSODIUM_GETKEY_SCRIPT@#$PGSODIUM_GETKEY_SCRIPT #g" \
72
58
$PSQL_CONF_FILE > " $x /postgresql.conf"
73
59
done
74
60
75
- echo " NOTE: Starting first server (v ${1} ) to load data into the system"
61
+ echo " Starting first server to load data into the system"
76
62
$OLDVER /bin/pg_ctl start -D " $DATDIR "
77
63
78
64
PRIMING_SCRIPT=@PRIMING_SCRIPT@
79
- MIGRATION_DATA=@MIGRATION_DATA@
65
+ MIGRATIONS_DIR=@MIGRATIONS_DIR@
66
+
67
+ echo " MIGRATIONS_DIR IS $MIGRATIONS_DIR "
68
+
69
+ for sql in " $MIGRATIONS_DIR " /db/init-scripts/* .sql; do
70
+ echo " $0 : running $sql "
71
+ $OLDVER /bin/psql -h localhost -d postgres -v ON_ERROR_STOP=1 --no-password --no-psqlrc -U postgres -f " $sql "
72
+ done
80
73
81
- $OLDVER /bin/psql -h localhost -d postgres -Xf " $PRIMING_SCRIPT "
82
- $OLDVER /bin/psql -h localhost -d postgres -Xf " $MIGRATION_DATA "
74
+ $OLDVER /bin/psql -h localhost -d postgres -v ON_ERROR_STOP=1 --no-password --no-psqlrc -U postgres -c " ALTER USER supabase_admin WITH PASSWORD '$PGPASSWORD '"
75
+ # run migrations as super user - postgres user demoted in post-setup
76
+ for sql in " $MIGRATIONS_DIR " /db/migrations/* .sql; do
77
+ echo " $0 : running $sql "
78
+ $OLDVER /bin/psql -h localhost -d postgres -v ON_ERROR_STOP=1 --no-password --no-psqlrc -U supabase_admin -f " $sql "
79
+ done
83
80
84
81
if [ " $UPGRADE_METHOD " == " pg_upgrade" ]; then
85
- echo " NOTE: Stopping old server (v ${1} ) to prepare for migration "
82
+ echo " Stopping old server"
86
83
$OLDVER /bin/pg_ctl stop -D " $DATDIR "
87
84
88
- echo " NOTE: Migrating old data $DATDIR to $NEWDAT using pg_upgrade"
85
+ echo " Starting old server"
86
+ $OLDVER /bin/pg_ctl start -D " $DATDIR "
87
+
88
+ echo " Ensuring $PGUSER is a superuser in the old database"
89
+ " $OLDVER " /bin/psql -h localhost -U supabase_admin -p 5432 -d postgres -c " ALTER USER $PGUSER WITH SUPERUSER;" || true
90
+
91
+ echo " Running pre-migration checks"
92
+ " $PG_PROVE " /bin/pg_prove --psql=" $OLDVER " /bin/psql -h localhost -U supabase_admin -d postgres -p 5432 " $MIGRATIONS_DIR " /tests/test.sql
93
+
94
+ echo " Running fixtures"
95
+ " $OLDVER " /bin/psql -h localhost -U supabase_admin -p 5432 -d postgres -f " $PGUPGRADE_TESTS /pg_upgrade/tests/97-enable-extensions.sql"
96
+ " $OLDVER " /bin/psql -h localhost -U supabase_admin -p 5432 -d postgres -f " $PGUPGRADE_TESTS /pg_upgrade/tests/98-data-fixtures.sql"
97
+ " $OLDVER " /bin/psql -h localhost -U supabase_admin -p 5432 -d postgres -f " $PGUPGRADE_TESTS /pg_upgrade/tests/99-fixtures.sql"
98
+
99
+ echo " Stopping old server"
100
+ $OLDVER /bin/pg_ctl stop -D " $DATDIR "
101
+
102
+ echo " Migrating old data $DATDIR to $NEWDAT using pg_upgrade"
89
103
90
104
export PGDATAOLD=" $DATDIR "
91
105
export PGDATANEW=" $NEWDAT "
92
106
export PGBINOLD=" $OLDVER /bin"
93
107
export PGBINNEW=" $NEWVER /bin"
94
108
95
- if ! $NEWVER /bin/pg_upgrade --check; then
109
+ # Create a temporary directory for pg_upgrade to work in
110
+ UPGRADE_WORKDIR=$( mktemp -d)
111
+ echo " Using temporary directory for pg_upgrade: $UPGRADE_WORKDIR "
112
+
113
+ # Change to the temporary directory before running pg_upgrade
114
+ pushd " $UPGRADE_WORKDIR "
115
+
116
+ if ! $NEWVER /bin/pg_upgrade -U " $PGUSER " --check; then
96
117
echo " ERROR: pg_upgrade check failed"
118
+ popd
97
119
exit 1
98
120
fi
99
121
100
- echo " NOTE: pg_upgrade check passed, proceeding with migration"
101
- $NEWVER /bin/pg_upgrade
102
- rm -f delete_old_cluster.sh # we don't need this
122
+ echo " pg_upgrade check passed, proceeding with migration"
123
+ $NEWVER /bin/pg_upgrade -U " $PGUSER "
124
+
125
+ # Change back to the original directory
126
+ popd
127
+ echo " Migration complete, running post-migration checks"
128
+ echo " Migration complete, running post-migration checks"
129
+ echo " NEWDAT IS $NEWDAT "
130
+ $NEWVER /bin/pg_ctl start -D " $NEWDAT "
131
+ echo " Turning off JIT"
132
+ cat << EOF > "$NEWDAT "/jit_off.sql
133
+ ALTER SYSTEM SET jit = off;
134
+ SELECT pg_reload_conf();
135
+ EOF
136
+ " $NEWVER " /bin/psql -h localhost -U supabase_admin -p 5432 -d postgres -f " $NEWDAT " /jit_off.sql
137
+
138
+ " $PG_PROVE " /bin/pg_prove --psql=" $NEWVER " /bin/psql -h localhost -U supabase_admin -d postgres -p 5432 \
139
+ " $PGUPGRADE_TESTS /pg_upgrade/tests/01-schema.sql"
140
+ " $PG_PROVE " /bin/pg_prove --psql=" $NEWVER " /bin/psql -h localhost -U supabase_admin -d postgres -p 5432 \
141
+ " $PGUPGRADE_TESTS /pg_upgrade/tests/02-data.sql"
142
+ " $PG_PROVE " /bin/pg_prove --psql=" $NEWVER " /bin/psql -h localhost -U supabase_admin -d postgres -p 5432 \
143
+ " $PGUPGRADE_TESTS /pg_upgrade/tests/03-settings.sql"
144
+ $NEWVER /bin/pg_ctl stop -D " $NEWDAT "
103
145
exit 0
104
146
fi
105
147
106
- if [ " $UPGRADE_METHOD " == " pg_dumpall" ]; then
107
- SQLDAT=" $DATDIR /dump.sql"
108
- echo " NOTE: Exporting data via pg_dumpall ($SQLDAT )"
109
- $NEWVER /bin/pg_dumpall -h localhost > " $SQLDAT "
148
+ # if [ "$UPGRADE_METHOD" == "pg_dumpall" ]; then
149
+ # SQLDAT="$DATDIR/dump.sql"
150
+ # echo "Exporting data via pg_dumpall ($SQLDAT)"
151
+ # $NEWVER/bin/pg_dumpall -h localhost > "$SQLDAT"
110
152
111
- echo " NOTE: Stopping old server (v${1} ) to prepare for migration"
112
- $OLDVER /bin/pg_ctl stop -D " $DATDIR "
153
+ # echo "Stopping old server (v${1}) to prepare for migration"
154
+ # $OLDVER/bin/pg_ctl stop -D "$DATDIR"
113
155
114
- echo " NOTE: Starting second server (v${2} ) to load data into the system"
115
- $NEWVER /bin/pg_ctl start -D " $NEWDAT "
156
+ # echo "Starting second server (v${2}) to load data into the system"
157
+ # $NEWVER/bin/pg_ctl start -D "$NEWDAT"
116
158
117
- echo " NOTE: Loading data into new server (v${2} ) via 'cat | psql'"
118
- cat " $SQLDAT " | $NEWVER /bin/psql -h localhost -d postgres
159
+ # echo "Loading data into new server (v${2}) via 'cat | psql'"
160
+ # cat "$SQLDAT" | $NEWVER/bin/psql -h localhost -d postgres
119
161
120
- printf " \n\n\n\n"
121
- echo " NOTE: Done, check logs. Stopping the server; new database is located at $NEWDAT "
122
- $NEWVER /bin/pg_ctl stop -D " $NEWDAT "
123
- fi
162
+ # printf "\n\n\n\n"
163
+ # echo "Done, check logs. Stopping the server; new database is located at $NEWDAT"
164
+ # $NEWVER/bin/pg_ctl stop -D "$NEWDAT"
165
+ # fi
0 commit comments