Skip to content

Commit ffa1052

Browse files
pcncsoedirgokangmingtaydragarciahf
authored
chore: merge release/15.6 changes into develop (#1320)
* fix: account for `public` grantee * fix(ci): respect postgresVersion input (#1237) * feat: bump gotrue version to v2.162.0 (#1241) * fix: only grant pg_read_all_data if it exists (#1242) * fix: only grant pg_read_all_data if it exists * fix: prevent `public` from being casted into `regrole` * fix(15.6): account for pg_stat_monitor major version upgrade (#1247) * chore: release updates to run physical backup as a service to 15.6 image (#1248) * chore: updates to run physical backups as a service (#1235) * chore: init commence-backup service * chore: bump adminapi and adminmgr * chore: bump version * fix: provide correct filename * chore: bump postgres version * fix(15.6/pg_upgrade): retry commands within the cleanup step; wait until PG is ready to accept connections (#1250) * fix(15.6/upgrades): collision when patching wrappers lib locations for upgrades (#1252) * feat: bump auth 2.162.1 on 15.6 (#1256) * fix(15.6): disable pg_stat_monitor (#1260) * fix: disable pg_stat_monitor * chore: bump version * fix(15.6): disable pg_stat_monitor (#1262) * fix: disable pg_stat_monitor * chore: bump version * feat: bump gotrue to v2.162.2 (#1264) * chore: add timescaledb 2.9.1; wrappers upgrade fix; wrappers & plv8 naming fix (#1259) Co-authored-by: Bobbie Soedirgo <[email protected]> Co-authored-by: Bobbie Soedirgo <[email protected]> Co-authored-by: Kang Ming <[email protected]> Co-authored-by: Stojan Dimitrovski <[email protected]> Co-authored-by: Sam Rose <[email protected]> fix(ci): respect postgresVersion input (#1237) fix: only grant pg_read_all_data if it exists (#1242) fix(15.6): disable pg_stat_monitor (#1260) * chore(15.6): bump pg version (#1273) * feat: bump auth to v2.163.0 on 15.6 (#1275) * fix: restart PG during pre-upgrade steps to shed hanging connections (#1271) * fix(upgrades): wrappers 4.2.0 -> wrappers 4.2.0 (#1278) * fix: handle supabase_admin authenticator membership snowflake * feat: add auth v2.163.1 to 15.6 (#1283) * feat: bump gotrue to v2.163.2 (#1287) * pg_net 0.11 on 15.6 release branch (#1290) * bump pg_net to 0.11.0 * bump image to 15.6.1.135 * fix: don't copy custom extension scripts during pg_upgrade (#1291) * fix: add recursive flag to custom extension script directory delete (#1292) * [GEN-11027] chore: reserve a fixed amount of blocks for the data volume; remove ansible pkg + ppa (#1295) * fix: grant predefined roles post-upgrade * fix: add more roles to reserved_roles & reserved_memberships (#1303) * fix: add more roles to reserved_roles & reserved_memberships * Update common-nix.vars.pkr.hcl * feat: update envoy lds config with auth jwks, oidc URLs, strip `sb-opk` header (#1296) * chore: udpate package repo for salt (#1307) * fix: use sudo for apt-get commands * Update pg net to 0.13.0 on pg 15.6 branch (#1315) * upgrade pg_net to 0.13.0 on 15.6 * bump postgres-version * chore: cleanup pgbouncer.get_auth ownership accordingly * chore: standardize * feat: filter timescaledb to only be included on v15 (#1321) * feat: filter timescaledb to only be included on v15 * chore: shuffle a bit to match what is needed for various versions * chore: small fixes on sb wrappers and plv8 to merge in all needed install function --------- Co-authored-by: Bobbie Soedirgo <[email protected]> Co-authored-by: Bobbie Soedirgo <[email protected]> Co-authored-by: Kang Ming <[email protected]> Co-authored-by: angelico <[email protected]> Co-authored-by: Stojan Dimitrovski <[email protected]> Co-authored-by: Sam Rose <[email protected]> Co-authored-by: Oliver Rice <[email protected]>
1 parent 4a1d472 commit ffa1052

File tree

13 files changed

+200
-93
lines changed

13 files changed

+200
-93
lines changed

.github/workflows/publish-nix-pgupgrade-scripts.yml

+3
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ jobs:
101101
run: |
102102
VERSION=$(sudo nix run nixpkgs#yq -- '.postgres_release["postgres'${{ matrix.postgres_version }}'"]' ansible/vars.yml)
103103
VERSION=$(echo $PG_VERSION | tr -d '"') # Remove any surrounding quotes
104+
if [[ "${{ inputs.postgresVersion }}" != "" ]]; then
105+
VERSION=${{ inputs.postgresVersion }}
106+
fi
104107
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
105108
106109
- name: Create a tarball containing pg_upgrade scripts

ansible/files/admin_api_scripts/pg_upgrade_scripts/common.sh

+12
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,24 @@ swap_postgres_and_supabase_admin() {
9191
alter database postgres connection limit 0;
9292
select pg_terminate_backend(pid) from pg_stat_activity where backend_type = 'client backend' and pid != pg_backend_pid();
9393
EOSQL
94+
95+
if [ -z "$IS_CI" ]; then
96+
retry 5 systemctl restart postgresql
97+
else
98+
CI_start_postgres ""
99+
fi
100+
101+
retry 8 pg_isready -h localhost -U supabase_admin
102+
94103
run_sql <<'EOSQL'
95104
set statement_timeout = '600s';
96105
begin;
97106
create role supabase_tmp superuser;
98107
set session authorization supabase_tmp;
99108
109+
-- to handle snowflakes that happened in the past
110+
revoke supabase_admin from authenticator;
111+
100112
do $$
101113
begin
102114
if exists (select from pg_extension where extname = 'timescaledb') then

ansible/files/admin_api_scripts/pg_upgrade_scripts/complete.sh

+3
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ EOF
7878

7979
run_sql -c "$RECREATE_PG_CRON_QUERY"
8080
fi
81+
82+
# #incident-2024-09-12-project-upgrades-are-temporarily-disabled
83+
run_sql -c "grant pg_read_all_data, pg_signal_backend to postgres"
8184
}
8285

8386
function complete_pg_upgrade {

ansible/files/admin_api_scripts/pg_upgrade_scripts/initiate.sh

+26-55
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ MOUNT_POINT="/data_migration"
3939
LOG_FILE="/var/log/pg-upgrade-initiate.log"
4040

4141
POST_UPGRADE_EXTENSION_SCRIPT="/tmp/pg_upgrade/pg_upgrade_extensions.sql"
42+
POST_UPGRADE_POSTGRES_PERMS_SCRIPT="/tmp/pg_upgrade/pg_upgrade_postgres_perms.sql"
4243
OLD_PGVERSION=$(run_sql -A -t -c "SHOW server_version;")
4344

4445
SERVER_LC_COLLATE=$(run_sql -A -t -c "SHOW lc_collate;")
@@ -47,7 +48,6 @@ SERVER_ENCODING=$(run_sql -A -t -c "SHOW server_encoding;")
4748

4849
POSTGRES_CONFIG_PATH="/etc/postgresql/postgresql.conf"
4950
PGBINOLD="/usr/lib/postgresql/bin"
50-
PGLIBOLD="/usr/lib/postgresql/lib"
5151

5252
PG_UPGRADE_BIN_DIR="/tmp/pg_upgrade_bin/$PGVERSION"
5353
NIX_INSTALLER_PATH="/tmp/persistent/nix-installer"
@@ -133,6 +133,22 @@ cleanup() {
133133
echo "Resetting postgres database connection limit"
134134
retry 5 run_sql -c "ALTER DATABASE postgres CONNECTION LIMIT -1;"
135135

136+
echo "Making sure postgres still has access to pg_shadow"
137+
cat << EOF >> $POST_UPGRADE_POSTGRES_PERMS_SCRIPT
138+
DO \$\$
139+
begin
140+
if exists (select from pg_authid where rolname = 'pg_read_all_data') then
141+
execute('grant pg_read_all_data to postgres');
142+
end if;
143+
end
144+
\$\$;
145+
grant pg_signal_backend to postgres;
146+
EOF
147+
148+
if [ -f $POST_UPGRADE_POSTGRES_PERMS_SCRIPT ]; then
149+
retry 5 run_sql -f $POST_UPGRADE_POSTGRES_PERMS_SCRIPT
150+
fi
151+
136152
if [ -z "$IS_CI" ] && [ -z "$IS_LOCAL_UPGRADE" ]; then
137153
echo "Unmounting data disk from ${MOUNT_POINT}"
138154
retry 3 umount $MOUNT_POINT
@@ -148,6 +164,14 @@ cleanup() {
148164
}
149165

150166
function handle_extensions {
167+
if [ -z "$IS_CI" ]; then
168+
retry 5 systemctl restart postgresql
169+
else
170+
CI_start_postgres
171+
fi
172+
173+
retry 8 pg_isready -h localhost -U supabase_admin
174+
151175
rm -f $POST_UPGRADE_EXTENSION_SCRIPT
152176
touch $POST_UPGRADE_EXTENSION_SCRIPT
153177

@@ -181,58 +205,6 @@ EOF
181205
done
182206
}
183207

184-
function patch_wrappers {
185-
local IS_NIX_UPGRADE=$1
186-
187-
WRAPPERS_ENABLED=$(run_sql -A -t -c "SELECT EXISTS(SELECT 1 FROM pg_extension WHERE extname = 'wrappers');")
188-
if [ "$WRAPPERS_ENABLED" = "f" ]; then
189-
echo "Wrappers extension not enabled. Skipping."
190-
return
191-
fi
192-
193-
# This is a workaround for older versions of wrappers which don't have the expected
194-
# naming scheme, containing the version in their library's file name
195-
# e.g. wrappers-0.1.16.so, rather than wrappers.so
196-
# pg_upgrade errors out when it doesn't find an equivalent file in the new PG version's
197-
# library directory, so we're making sure the new version has the expected (old version's)
198-
# file name.
199-
# After the upgrade completes, the new version's library file is used.
200-
# i.e.
201-
# - old version: wrappers-0.1.16.so
202-
# - new version: wrappers-0.1.18.so
203-
# - workaround to make pg_upgrade happy: copy wrappers-0.1.18.so to wrappers-0.1.16.so
204-
if [ "$IS_NIX_UPGRADE" = "true" ]; then
205-
if [ -d "$PGLIBOLD" ]; then
206-
OLD_WRAPPER_LIB_PATH=$(find "$PGLIBOLD" -name "wrappers*so" -print -quit)
207-
OLD_LIB_FILE_NAME=$(basename "$OLD_WRAPPER_LIB_PATH")
208-
209-
find /nix/store/ -name "wrappers*so" -print0 | while read -r -d $'\0' WRAPPERS_LIB_PATH; do
210-
if [ -f "$WRAPPERS_LIB_PATH" ]; then
211-
WRAPPERS_LIB_PATH_DIR=$(dirname "$WRAPPERS_LIB_PATH")
212-
if [ "$WRAPPERS_LIB_PATH" != "$WRAPPERS_LIB_PATH_DIR/${OLD_LIB_FILE_NAME}" ]; then
213-
echo "Copying $WRAPPERS_LIB_PATH to $WRAPPERS_LIB_PATH_DIR/${OLD_LIB_FILE_NAME}"
214-
cp "$WRAPPERS_LIB_PATH" "$WRAPPERS_LIB_PATH_DIR/${OLD_LIB_FILE_NAME}" || true
215-
fi
216-
fi
217-
done
218-
fi
219-
else
220-
if [ -d "$PGLIBOLD" ]; then
221-
WRAPPERS_LIB_PATH=$(find "$PGLIBNEW" -name "wrappers*so" -print -quit)
222-
if [ -f "$WRAPPERS_LIB_PATH" ]; then
223-
OLD_WRAPPER_LIB_PATH=$(find "$PGLIBOLD" -name "wrappers*so" -print -quit)
224-
if [ -f "$OLD_WRAPPER_LIB_PATH" ]; then
225-
LIB_FILE_NAME=$(basename "$OLD_WRAPPER_LIB_PATH")
226-
if [ "$WRAPPERS_LIB_PATH" != "$PGLIBNEW/${LIB_FILE_NAME}" ]; then
227-
echo "Copying $WRAPPERS_LIB_PATH to $PGLIBNEW/${LIB_FILE_NAME}"
228-
cp "$WRAPPERS_LIB_PATH" "$PGLIBNEW/${LIB_FILE_NAME}" || true
229-
fi
230-
fi
231-
fi
232-
fi
233-
fi
234-
}
235-
236208
function initiate_upgrade {
237209
mkdir -p "$MOUNT_POINT"
238210
SHARED_PRELOAD_LIBRARIES=$(cat "$POSTGRES_CONFIG_PATH" | grep shared_preload_libraries | sed "s/shared_preload_libraries =\s\{0,1\}'\(.*\)'.*/\1/")
@@ -409,8 +381,6 @@ function initiate_upgrade {
409381
export LD_LIBRARY_PATH="${PGLIBNEW}"
410382
fi
411383

412-
patch_wrappers "$IS_NIX_UPGRADE"
413-
414384
echo "9. Creating new data directory, initializing database"
415385
chown -R postgres:postgres "$MOUNT_POINT/"
416386
rm -rf "${PGDATANEW:?}/"
@@ -473,6 +443,7 @@ EOF
473443
cp -R /etc/postgresql-custom/* "$MOUNT_POINT/conf/"
474444
# removing supautils config as to allow the latest one provided by the latest image to be used
475445
rm -f "$MOUNT_POINT/conf/supautils.conf" || true
446+
rm -rf "$MOUNT_POINT/conf/extension-custom-scripts" || true
476447

477448
# removing wal-g config as to allow it to be explicitly enabled on the new instance
478449
rm -f "$MOUNT_POINT/conf/wal-g.conf"

ansible/files/postgresql_config/supautils.conf.j2

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ supautils.privileged_extensions_custom_scripts_path = '/etc/postgresql-custom/ex
99
supautils.privileged_extensions_superuser = 'supabase_admin'
1010
supautils.privileged_role = 'postgres'
1111
supautils.privileged_role_allowed_configs = 'auto_explain.log_min_duration, auto_explain.log_nested_statements, log_lock_waits, log_min_messages, pg_net.batch_size, pg_net.ttl, pgaudit.log, pgaudit.log_catalog, pgaudit.log_client, pgaudit.log_level, pgaudit.log_relation, pgaudit.log_rows, pgaudit.log_statement, pgaudit.log_statement_once, pgaudit.role, pgrst.*, plan_filter.*, safeupdate.enabled, session_replication_role, track_io_timing'
12-
supautils.reserved_memberships = 'pg_read_server_files, pg_write_server_files, pg_execute_server_program, authenticator'
13-
supautils.reserved_roles = 'supabase_admin, supabase_auth_admin, supabase_storage_admin, supabase_read_only_user, supabase_replication_admin, dashboard_user, pgbouncer, service_role*, authenticator*, authenticated*, anon*'
12+
supautils.reserved_memberships = 'pg_read_server_files, pg_write_server_files, pg_execute_server_program, supabase_admin, supabase_auth_admin, supabase_storage_admin, supabase_read_only_user, supabase_realtime_admin, supabase_replication_admin, dashboard_user, pgbouncer, authenticator'
13+
supautils.reserved_roles = 'supabase_admin, supabase_auth_admin, supabase_storage_admin, supabase_read_only_user, supabase_realtime_admin, supabase_replication_admin, dashboard_user, pgbouncer, service_role*, authenticator*, authenticated*, anon*'

ansible/vars.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ postgrest_release: "12.2.3"
2525
postgrest_arm_release_checksum: sha1:fbfd6613d711ce1afa25c42d5df8f1b017f396f9
2626
postgrest_x86_release_checksum: sha1:61c513f91a8931be4062587b9d4a18b42acf5c05
2727

28-
gotrue_release: 2.162.0
29-
gotrue_release_checksum: sha1:855b23bd002577290c7d42d7042ac0f5316984b1
28+
gotrue_release: 2.163.2
29+
gotrue_release_checksum: sha1:31889bc8c498b924c2cb3b6c4084ef6e57ed97c0
3030

3131
aws_cli_release: "2.2.7"
3232

ebssurrogate/scripts/surrogate-bootstrap-nix.sh

+5
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,11 @@ function format_and_mount_rootfs {
110110
fi
111111

112112
mkfs.ext4 /dev/xvdh
113+
114+
# Explicitly reserving 100MiB worth of blocks for the data volume
115+
RESERVED_DATA_VOLUME_BLOCK_COUNT=$((100 * 1024 * 1024 / 4096))
116+
tune2fs -r $RESERVED_DATA_VOLUME_BLOCK_COUNT /dev/xvdh
117+
113118
mkdir -p /mnt/data
114119
mount -o defaults,discard /dev/xvdh /mnt/data
115120
}

flake.nix

+9-3
Original file line numberDiff line numberDiff line change
@@ -213,9 +213,15 @@
213213
in map (path: pkgs.callPackage path { inherit postgresql; }) orioledbExtension;
214214

215215
makeOurPostgresPkgs = version:
216-
let postgresql = getPostgresqlPackage version;
217-
in map (path: pkgs.callPackage path { inherit postgresql; }) ourExtensions;
218-
216+
let
217+
postgresql = getPostgresqlPackage version;
218+
extensions = if version == "15"
219+
then ourExtensions ++ [
220+
./nix/ext/timescaledb-2.9.1.nix
221+
]
222+
else ourExtensions;
223+
in
224+
map (path: pkgs.callPackage path { inherit postgresql; }) extensions;
219225
# Create an attrset that contains all the extensions included in a server for the orioledb version of postgresql + extension.
220226
makeOurOrioleDbPostgresPkgsSet = version: patchedPostgres:
221227
(builtins.listToAttrs (map

nix/ext/plv8.nix

+31-11
Original file line numberDiff line numberDiff line change
@@ -97,23 +97,43 @@ stdenv.mkDerivation (finalAttrs: {
9797
''}
9898
'';
9999

100-
postInstall = ''
100+
postInstall = ''
101101
# Move the redirected to proper directory.
102102
# There appear to be no references to the install directories
103103
# so changing them does not cause issues.
104104
mv "$out/nix/store"/*/* "$out"
105105
rmdir "$out/nix/store"/* "$out/nix/store" "$out/nix"
106106
107-
${lib.optionalString stdenv.isDarwin ''
108-
install_name_tool -add_rpath "${v8}/lib" $out/lib/plv8-${finalAttrs.version}${postgresql.dlSuffix}
109-
install_name_tool -add_rpath "${postgresql}/lib" $out/lib/plv8-${finalAttrs.version}${postgresql.dlSuffix}
110-
install_name_tool -add_rpath "${stdenv.cc.cc.lib}/lib" $out/lib/plv8-${finalAttrs.version}${postgresql.dlSuffix}
111-
install_name_tool -change @rpath/libv8_monolith.dylib ${v8}/lib/libv8_monolith.dylib $out/lib/plv8-${finalAttrs.version}${postgresql.dlSuffix}
112-
''}
113-
114-
${lib.optionalString (!stdenv.isDarwin) ''
115-
${patchelf}/bin/patchelf --set-rpath "${v8}/lib:${postgresql}/lib:${stdenv.cc.cc.lib}/lib" $out/lib/plv8-${finalAttrs.version}${postgresql.dlSuffix}
116-
''}
107+
# Handle different PostgreSQL versions
108+
if [ "${lib.versions.major postgresql.version}" = "15" ]; then
109+
mv "$out/lib/plv8-${finalAttrs.version}.so" "$out/lib/plv8.so"
110+
ln -s "$out/lib/plv8.so" "$out/lib/plv8-${finalAttrs.version}.so"
111+
sed -i 's|module_pathname = '"'"'$libdir/plv8-[0-9.]*'"'"'|module_pathname = '"'"'$libdir/plv8'"'"'|' "$out/share/postgresql/extension/plv8.control"
112+
sed -i 's|module_pathname = '"'"'$libdir/plv8-[0-9.]*'"'"'|module_pathname = '"'"'$libdir/plv8'"'"'|' "$out/share/postgresql/extension/plcoffee.control"
113+
sed -i 's|module_pathname = '"'"'$libdir/plv8-[0-9.]*'"'"'|module_pathname = '"'"'$libdir/plv8'"'"'|' "$out/share/postgresql/extension/plls.control"
114+
115+
${lib.optionalString stdenv.isDarwin ''
116+
install_name_tool -add_rpath "${v8}/lib" $out/lib/plv8.so
117+
install_name_tool -add_rpath "${postgresql}/lib" $out/lib/plv8.so
118+
install_name_tool -add_rpath "${stdenv.cc.cc.lib}/lib" $out/lib/plv8.so
119+
install_name_tool -change @rpath/libv8_monolith.dylib ${v8}/lib/libv8_monolith.dylib $out/lib/plv8.so
120+
''}
121+
122+
${lib.optionalString (!stdenv.isDarwin) ''
123+
${patchelf}/bin/patchelf --set-rpath "${v8}/lib:${postgresql}/lib:${stdenv.cc.cc.lib}/lib" $out/lib/plv8.so
124+
''}
125+
else
126+
${lib.optionalString stdenv.isDarwin ''
127+
install_name_tool -add_rpath "${v8}/lib" $out/lib/plv8-${finalAttrs.version}${postgresql.dlSuffix}
128+
install_name_tool -add_rpath "${postgresql}/lib" $out/lib/plv8-${finalAttrs.version}${postgresql.dlSuffix}
129+
install_name_tool -add_rpath "${stdenv.cc.cc.lib}/lib" $out/lib/plv8-${finalAttrs.version}${postgresql.dlSuffix}
130+
install_name_tool -change @rpath/libv8_monolith.dylib ${v8}/lib/libv8_monolith.dylib $out/lib/plv8-${finalAttrs.version}${postgresql.dlSuffix}
131+
''}
132+
133+
${lib.optionalString (!stdenv.isDarwin) ''
134+
${patchelf}/bin/patchelf --set-rpath "${v8}/lib:${postgresql}/lib:${stdenv.cc.cc.lib}/lib" $out/lib/plv8-${finalAttrs.version}${postgresql.dlSuffix}
135+
''}
136+
fi
117137
'';
118138

119139
meta = with lib; {

nix/ext/timescaledb-2.9.1.nix

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
{ lib, stdenv, fetchFromGitHub, cmake, postgresql, openssl, libkrb5 }:
2+
3+
stdenv.mkDerivation rec {
4+
pname = "timescaledb-apache";
5+
version = "2.9.1";
6+
7+
nativeBuildInputs = [ cmake ];
8+
buildInputs = [ postgresql openssl libkrb5 ];
9+
10+
src = fetchFromGitHub {
11+
owner = "timescale";
12+
repo = "timescaledb";
13+
rev = version;
14+
hash = "sha256-fvVSxDiGZAewyuQ2vZDb0I6tmlDXl6trjZp8+qDBtb8=";
15+
};
16+
17+
cmakeFlags = [ "-DSEND_TELEMETRY_DEFAULT=OFF" "-DREGRESS_CHECKS=OFF" "-DTAP_CHECKS=OFF" "-DAPACHE_ONLY=1" ]
18+
++ lib.optionals stdenv.isDarwin [ "-DLINTER=OFF" ];
19+
20+
# Fix the install phase which tries to install into the pgsql extension dir,
21+
# and cannot be manually overridden. This is rather fragile but works OK.
22+
postPatch = ''
23+
for x in CMakeLists.txt sql/CMakeLists.txt; do
24+
substituteInPlace "$x" \
25+
--replace 'DESTINATION "''${PG_SHAREDIR}/extension"' "DESTINATION \"$out/share/postgresql/extension\""
26+
done
27+
28+
for x in src/CMakeLists.txt src/loader/CMakeLists.txt tsl/src/CMakeLists.txt; do
29+
substituteInPlace "$x" \
30+
--replace 'DESTINATION ''${PG_PKGLIBDIR}' "DESTINATION \"$out/lib\""
31+
done
32+
'';
33+
34+
35+
# timescaledb-2.9.1.so already exists in the lib directory
36+
# we have no need for the timescaledb.so or control file
37+
postInstall = ''
38+
rm $out/lib/timescaledb.so
39+
rm $out/share/postgresql/extension/timescaledb.control
40+
'';
41+
42+
meta = with lib; {
43+
description = "Scales PostgreSQL for time-series data via automatic partitioning across time and space";
44+
homepage = "https://www.timescale.com/";
45+
changelog = "https://github.com/timescale/timescaledb/blob/${version}/CHANGELOG.md";
46+
maintainers = with maintainers; [ samrose ];
47+
platforms = postgresql.meta.platforms;
48+
license = licenses.asl20;
49+
broken = versionOlder postgresql.version "13";
50+
};
51+
}

0 commit comments

Comments
 (0)