Skip to content

Commit e73265c

Browse files
authored
Merge branch 'develop' into sam/oriole-extensions-schema
2 parents bf4592a + 084b914 commit e73265c

17 files changed

+564
-153
lines changed

Dockerfile-15

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ ARG rum_release=1.3.13
2424
ARG pg_hashids_release=cd0e1b31d52b394a0df64079406a14a4f7387cd6
2525
ARG libsodium_release=1.0.18
2626
ARG pgsodium_release=3.1.6
27-
ARG pg_graphql_release=1.5.1
27+
ARG pg_graphql_release=1.5.11
2828
ARG pg_stat_monitor_release=1.1.1
2929
ARG pg_jsonschema_release=0.1.4
3030
ARG pg_repack_release=1.4.8

Dockerfile-orioledb-17

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ ARG rum_release=1.3.13
2424
ARG pg_hashids_release=cd0e1b31d52b394a0df64079406a14a4f7387cd6
2525
ARG libsodium_release=1.0.18
2626
ARG pgsodium_release=3.1.6
27-
ARG pg_graphql_release=1.5.1
27+
ARG pg_graphql_release=1.5.11
2828
ARG pg_stat_monitor_release=1.1.1
2929
ARG pg_jsonschema_release=0.1.4
3030
ARG pg_repack_release=1.4.8

README.md

Lines changed: 75 additions & 64 deletions
Large diffs are not rendered by default.

ansible/files/admin_api_scripts/grow_fs.sh

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,32 @@ if pgrep resizefs; then
99
exit 1
1010
fi
1111

12+
# Parses the output of lsblk to get the root partition number
13+
# Example output:
14+
# NAME MOUNTPOINT
15+
# nvme0n1
16+
# ├─nvme0n1p1 /boot
17+
# └─nvme0n1p3 /
18+
# nvme1n1 /data
19+
#
20+
# Resulting in:
21+
# └─nvme0n1p3 / -> nvme0n1p3 -> 3
22+
ROOT_PARTITION_NUMBER=$(lsblk -no NAME,MOUNTPOINT | grep ' /$' | awk '{print $1;}' | sed 's/.*nvme[0-9]n[0-9]p//g')
23+
24+
if ! [[ "$ROOT_PARTITION_NUMBER" =~ ^[0-9]+$ ]]; then
25+
echo "Error: ROOT_PARTITION_NUMBER is not a valid number: $ROOT_PARTITION_NUMBER"
26+
exit 1
27+
fi
28+
1229
if [ -b /dev/nvme1n1 ] ; then
1330
if [[ "${VOLUME_TYPE}" == "data" ]]; then
1431
resize2fs /dev/nvme1n1
1532

1633
elif [[ "${VOLUME_TYPE}" == "root" ]] ; then
1734
PLACEHOLDER_FL=/home/ubuntu/50M_PLACEHOLDER
1835
rm -f "${PLACEHOLDER_FL}" || true
19-
growpart /dev/nvme0n1 2
20-
resize2fs /dev/nvme0n1p2
36+
growpart /dev/nvme0n1 "${ROOT_PARTITION_NUMBER}"
37+
resize2fs "/dev/nvme0n1p${ROOT_PARTITION_NUMBER}"
2138
if [[ ! -f "${PLACEHOLDER_FL}" ]] ; then
2239
fallocate -l50M "${PLACEHOLDER_FL}"
2340
fi
@@ -26,7 +43,7 @@ if [ -b /dev/nvme1n1 ] ; then
2643
exit 1
2744
fi
2845
else
29-
growpart /dev/nvme0n1 2
30-
resize2fs /dev/nvme0n1p2
46+
growpart /dev/nvme0n1 "${ROOT_PARTITION_NUMBER}"
47+
resize2fs "/dev/nvme0n1p${ROOT_PARTITION_NUMBER}"
3148
fi
3249
echo "Done resizing disk"

ebssurrogate/scripts/qemu-bootstrap-nix.sh

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ function waitfor_boot_finished {
2222
}
2323

2424
function install_packages {
25-
apt-get update && sudo apt-get install software-properties-common e2fsprogs -y
25+
apt-get update && sudo apt-get install software-properties-common e2fsprogs nfs-common -y
2626
add-apt-repository --yes --update ppa:ansible/ansible && sudo apt-get install ansible -y
2727
ansible-galaxy collection install community.general
2828
}
@@ -143,4 +143,6 @@ function clean_system {
143143

144144
install_nix
145145
execute_stage2_playbook
146+
# we do not want to ship an initialized DB as this is performed as needed
147+
rm -rf /data/pgdata
146148
cloud-init clean --logs

flake.nix

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@
6868
buildPgrxExtension_0_12_6 = prev.buildPgrxExtension.override {
6969
cargo-pgrx = final.cargo-pgrx.cargo-pgrx_0_12_6;
7070
};
71+
72+
buildPgrxExtension_0_12_9 = prev.buildPgrxExtension.override {
73+
cargo-pgrx = final.cargo-pgrx.cargo-pgrx_0_12_9;
74+
};
75+
7176
})
7277
(final: prev: {
7378
postgresql = final.callPackage ./nix/postgresql/default.nix {
@@ -394,6 +399,7 @@
394399
supabase-groonga = supabase-groonga;
395400
cargo-pgrx_0_11_3 = pkgs.cargo-pgrx.cargo-pgrx_0_11_3;
396401
cargo-pgrx_0_12_6 = pkgs.cargo-pgrx.cargo-pgrx_0_12_6;
402+
cargo-pgrx_0_12_9 = pkgs.cargo-pgrx.cargo-pgrx_0_12_9;
397403
# PostgreSQL versions.
398404
psql_15 = postgresVersions.psql_15;
399405
psql_orioledb-17 = postgresVersions.psql_orioledb-17;
@@ -559,7 +565,17 @@
559565
chmod +x $out/bin/dbmate-tool
560566
wrapProgram $out/bin/dbmate-tool \
561567
--prefix PATH : ${pkgs.lib.makeBinPath [ pkgs.overmind pkgs.dbmate pkgs.nix pkgs.jq pkgs.yq ]}
562-
'';
568+
'';
569+
update-readme = pkgs.runCommand "update-readme" {
570+
nativeBuildInputs = [ pkgs.makeWrapper ];
571+
buildInputs = [ pkgs.nushell ];
572+
} ''
573+
mkdir -p $out/bin
574+
cp ${./nix/tools/update_readme.nu} $out/bin/update-readme
575+
chmod +x $out/bin/update-readme
576+
wrapProgram $out/bin/update-readme \
577+
--prefix PATH : ${pkgs.nushell}/bin
578+
'';
563579
};
564580

565581

@@ -818,6 +834,7 @@
818834
pg-restore = mkApp "pg-restore" "pg-restore";
819835
local-infra-bootstrap = mkApp "local-infra-bootstrap" "local-infra-bootstrap";
820836
dbmate-tool = mkApp "dbmate-tool" "dbmate-tool";
837+
update-readme = mkApp "update-readme" "update-readme";
821838
};
822839

823840
# 'devShells.default' lists the set of packages that are included in the
@@ -857,6 +874,7 @@
857874
basePackages.migrate-tool
858875
basePackages.sync-exts-versions
859876
dbmate
877+
nushell
860878
];
861879
shellHook = ''
862880
export HISTFILE=.history

migrations/db/migrations/20221207154255_create_pgsodium_and_vault.sql

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,34 +5,44 @@ DECLARE
55
pgsodium_exists boolean;
66
vault_exists boolean;
77
BEGIN
8-
pgsodium_exists = (
9-
select count(*) = 1
10-
from pg_available_extensions
11-
where name = 'pgsodium'
12-
and default_version in ('3.1.6', '3.1.7', '3.1.8', '3.1.9')
13-
);
14-
15-
vault_exists = (
8+
IF EXISTS (SELECT FROM pg_available_extensions WHERE name = 'supabase_vault' AND default_version != '0.2.8') THEN
9+
CREATE EXTENSION IF NOT EXISTS supabase_vault;
10+
11+
-- for some reason extension custom scripts aren't run during AMI build, so
12+
-- we manually run it here
13+
GRANT USAGE ON SCHEMA vault TO postgres WITH GRANT OPTION;
14+
GRANT SELECT, DELETE ON vault.secrets, vault.decrypted_secrets TO postgres WITH GRANT OPTION;
15+
GRANT EXECUTE ON FUNCTION vault.create_secret, vault.update_secret, vault._crypto_aead_det_decrypt TO postgres WITH GRANT OPTION;
16+
ELSE
17+
pgsodium_exists = (
1618
select count(*) = 1
1719
from pg_available_extensions
18-
where name = 'supabase_vault'
19-
);
20-
21-
IF pgsodium_exists
22-
THEN
23-
create extension if not exists pgsodium;
24-
25-
grant pgsodium_keyiduser to postgres with admin option;
26-
grant pgsodium_keyholder to postgres with admin option;
27-
grant pgsodium_keymaker to postgres with admin option;
28-
29-
grant execute on function pgsodium.crypto_aead_det_decrypt(bytea, bytea, uuid, bytea) to service_role;
30-
grant execute on function pgsodium.crypto_aead_det_encrypt(bytea, bytea, uuid, bytea) to service_role;
31-
grant execute on function pgsodium.crypto_aead_det_keygen to service_role;
32-
33-
IF vault_exists
20+
where name = 'pgsodium'
21+
and default_version in ('3.1.6', '3.1.7', '3.1.8', '3.1.9')
22+
);
23+
24+
vault_exists = (
25+
select count(*) = 1
26+
from pg_available_extensions
27+
where name = 'supabase_vault'
28+
);
29+
30+
IF pgsodium_exists
3431
THEN
35-
create extension if not exists supabase_vault;
32+
create extension if not exists pgsodium;
33+
34+
grant pgsodium_keyiduser to postgres with admin option;
35+
grant pgsodium_keyholder to postgres with admin option;
36+
grant pgsodium_keymaker to postgres with admin option;
37+
38+
grant execute on function pgsodium.crypto_aead_det_decrypt(bytea, bytea, uuid, bytea) to service_role;
39+
grant execute on function pgsodium.crypto_aead_det_encrypt(bytea, bytea, uuid, bytea) to service_role;
40+
grant execute on function pgsodium.crypto_aead_det_keygen to service_role;
41+
42+
IF vault_exists
43+
THEN
44+
create extension if not exists supabase_vault;
45+
END IF;
3646
END IF;
3747
END IF;
3848
END $$;

migrations/db/migrations/20230529180330_alter_api_roles_for_inherit.sql

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@ ALTER ROLE authenticated inherit;
44
ALTER ROLE anon inherit;
55
ALTER ROLE service_role inherit;
66

7-
GRANT pgsodium_keyholder to service_role;
7+
DO $$
8+
BEGIN
9+
IF EXISTS (SELECT FROM pg_roles WHERE rolname = 'pgsodium_keyholder') THEN
10+
GRANT pgsodium_keyholder to service_role;
11+
END IF;
12+
END $$;
813

914
-- migrate:down
1015

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,31 @@
11
-- migrate:up
2-
CREATE OR REPLACE FUNCTION pgsodium.mask_role(masked_role regrole, source_name text, view_name text)
3-
RETURNS void
4-
LANGUAGE plpgsql
5-
SECURITY DEFINER
6-
SET search_path TO ''
7-
AS $function$
2+
3+
DO $$
84
BEGIN
9-
EXECUTE format(
10-
'GRANT SELECT ON pgsodium.key TO %s',
11-
masked_role);
5+
IF EXISTS (SELECT FROM pg_extension WHERE extname = 'pgsodium') THEN
6+
CREATE OR REPLACE FUNCTION pgsodium.mask_role(masked_role regrole, source_name text, view_name text)
7+
RETURNS void
8+
LANGUAGE plpgsql
9+
SECURITY DEFINER
10+
SET search_path TO ''
11+
AS $function$
12+
BEGIN
13+
EXECUTE format(
14+
'GRANT SELECT ON pgsodium.key TO %s',
15+
masked_role);
1216

13-
EXECUTE format(
14-
'GRANT pgsodium_keyiduser, pgsodium_keyholder TO %s',
15-
masked_role);
17+
EXECUTE format(
18+
'GRANT pgsodium_keyiduser, pgsodium_keyholder TO %s',
19+
masked_role);
1620

17-
EXECUTE format(
18-
'GRANT ALL ON %I TO %s',
19-
view_name,
20-
masked_role);
21-
RETURN;
22-
END
23-
$function$;
21+
EXECUTE format(
22+
'GRANT ALL ON %I TO %s',
23+
view_name,
24+
masked_role);
25+
RETURN;
26+
END
27+
$function$;
28+
END IF;
29+
END $$;
2430

2531
-- migrate:down
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
-- migrate:up
2+
CREATE OR REPLACE FUNCTION extensions.grant_pg_net_access()
3+
RETURNS event_trigger
4+
LANGUAGE plpgsql
5+
AS $$
6+
BEGIN
7+
IF EXISTS (
8+
SELECT 1
9+
FROM pg_event_trigger_ddl_commands() AS ev
10+
JOIN pg_extension AS ext
11+
ON ev.objid = ext.oid
12+
WHERE ext.extname = 'pg_net'
13+
)
14+
THEN
15+
IF NOT EXISTS (
16+
SELECT 1
17+
FROM pg_roles
18+
WHERE rolname = 'supabase_functions_admin'
19+
)
20+
THEN
21+
CREATE USER supabase_functions_admin NOINHERIT CREATEROLE LOGIN NOREPLICATION;
22+
END IF;
23+
24+
GRANT USAGE ON SCHEMA net TO supabase_functions_admin, postgres, anon, authenticated, service_role;
25+
26+
IF EXISTS (
27+
SELECT FROM pg_extension
28+
WHERE extname = 'pg_net'
29+
-- all versions in use on existing projects as of 2025-02-20
30+
-- version 0.12.0 onwards don't need these applied
31+
AND extversion IN ('0.2', '0.6', '0.7', '0.7.1', '0.8', '0.10.0', '0.11.0')
32+
) THEN
33+
ALTER function net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) SECURITY DEFINER;
34+
ALTER function net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) SECURITY DEFINER;
35+
36+
ALTER function net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) SET search_path = net;
37+
ALTER function net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) SET search_path = net;
38+
39+
REVOKE ALL ON FUNCTION net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) FROM PUBLIC;
40+
REVOKE ALL ON FUNCTION net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) FROM PUBLIC;
41+
42+
GRANT EXECUTE ON FUNCTION net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) TO supabase_functions_admin, postgres, anon, authenticated, service_role;
43+
GRANT EXECUTE ON FUNCTION net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) TO supabase_functions_admin, postgres, anon, authenticated, service_role;
44+
END IF;
45+
END IF;
46+
END;
47+
$$;
48+
49+
DO $$
50+
BEGIN
51+
IF EXISTS (SELECT FROM pg_extension WHERE extname = 'pg_net')
52+
THEN
53+
ALTER function net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) SECURITY INVOKER;
54+
ALTER function net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) SECURITY INVOKER;
55+
56+
REVOKE EXECUTE ON FUNCTION net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) FROM supabase_functions_admin, postgres, anon, authenticated, service_role;
57+
REVOKE EXECUTE ON FUNCTION net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) FROM supabase_functions_admin, postgres, anon, authenticated, service_role;
58+
59+
GRANT ALL ON FUNCTION net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) TO PUBLIC;
60+
GRANT ALL ON FUNCTION net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) TO PUBLIC;
61+
END IF;
62+
END $$;
63+
64+
-- migrate:down

0 commit comments

Comments
 (0)