Add postgres_fdw to database (#2854)

* Add postgres_fdw to database

* Add wrappers to database

* Add cp
This commit is contained in:
martmull
2023-12-08 14:43:52 +01:00
committed by GitHub
parent 7535c84e3d
commit 88abb11448
4 changed files with 71 additions and 13 deletions

View File

@ -1,9 +1,9 @@
ARG IMAGE_TAG='15.4.0-debian-11-r45' ARG IMAGE_TAG='15.5.0-debian-11-r15'
FROM bitnami/postgresql:${IMAGE_TAG} FROM bitnami/postgresql:${IMAGE_TAG}
ARG PG_MAIN_VERSION=15 ARG PG_MAIN_VERSION=15
ARG PG_GRAPHQL_VERSION=1.3.0 ARG PG_GRAPHQL_VERSION=1.4.2
ARG TARGETARCH ARG TARGETARCH
USER root USER root
@ -23,16 +23,22 @@ RUN set -eux; \
;; \ ;; \
esac; esac;
RUN apt update && apt install -y curl RUN apt update && apt install curl -y
# Install precompiled pg_graphql extensions # Install precompiled pg_graphql extensions
RUN curl -L "https://github.com/supabase/pg_graphql/releases/download/v${PG_GRAPHQL_VERSION}/pg_graphql-v${PG_GRAPHQL_VERSION}-pg${PG_MAIN_VERSION}-${TARGETARCH}-linux-gnu.deb" -o pg_graphql.deb RUN curl -L "https://github.com/supabase/pg_graphql/releases/download/v${PG_GRAPHQL_VERSION}/pg_graphql-v${PG_GRAPHQL_VERSION}-pg${PG_MAIN_VERSION}-${TARGETARCH}-linux-gnu.deb" -o pg_graphql.deb
RUN dpkg --install pg_graphql.deb RUN dpkg --install pg_graphql.deb
RUN cp /usr/share/postgresql/15/extension/pg_graphql* /opt/bitnami/postgresql/share/extension/ RUN cp /usr/share/postgresql/${PG_MAIN_VERSION}/extension/pg_graphql* /opt/bitnami/postgresql/share/extension/
RUN cp /usr/lib/postgresql/15/lib/pg_graphql* /opt/bitnami/postgresql/lib/ RUN cp /usr/lib/postgresql/${PG_MAIN_VERSION}/lib/pg_graphql* /opt/bitnami/postgresql/lib/
# Install precompiled supabase wrappers extensions
RUN curl -L "https://github.com/supabase/wrappers/releases/download/v${WRAPPERS_VERSION}/wrappers-v${WRAPPERS_VERSION}-pg${PG_MAIN_VERSION}-${TARGETARCH}-linux-gnu.deb" -o wrappers.deb
RUN dpkg --install wrappers.deb
RUN cp /usr/share/postgresql/${PG_MAIN_VERSION}/extension/wrappers* /opt/bitnami/postgresql/share/extension/
RUN cp /usr/lib/postgresql/${PG_MAIN_VERSION}/lib/wrappers* /opt/bitnami/postgresql/lib/
COPY ./infra/build/postgres/init.sql /docker-entrypoint-initdb.d/ COPY ./infra/build/postgres/init.sql /docker-entrypoint-initdb.d/
USER 1001 USER 1001
ENTRYPOINT [ "/opt/bitnami/scripts/postgresql/entrypoint.sh" ] ENTRYPOINT [ "/opt/bitnami/scripts/postgresql/entrypoint.sh" ]
CMD [ "/opt/bitnami/scripts/postgresql/run.sh" ] CMD [ "/opt/bitnami/scripts/postgresql/run.sh" ]

View File

@ -1,9 +1,10 @@
ARG PG_MAIN_VERSION=14 ARG PG_MAIN_VERSION=15.5
FROM postgres:${PG_MAIN_VERSION} as postgres FROM postgres:${PG_MAIN_VERSION}-bullseye as postgres
ARG PG_MAIN_VERSION ARG PG_MAIN_VERSION=15
ARG PG_GRAPHQL_VERSION=1.4.2 ARG PG_GRAPHQL_VERSION=1.4.2
ARG WRAPPERS_VERSION=0.2.0
ARG TARGETARCH ARG TARGETARCH
RUN set -eux; \ RUN set -eux; \
@ -21,10 +22,14 @@ RUN set -eux; \
;; \ ;; \
esac; esac;
RUN apt update && apt install -y curl RUN apt update && apt install curl -y
# Install precompiled pg_graphql extensions # Install precompiled pg_graphql extensions
RUN curl -L "https://github.com/supabase/pg_graphql/releases/download/v${PG_GRAPHQL_VERSION}/pg_graphql-v${PG_GRAPHQL_VERSION}-pg${PG_MAIN_VERSION}-${TARGETARCH}-linux-gnu.deb" -o pg_graphql.deb RUN curl -L "https://github.com/supabase/pg_graphql/releases/download/v${PG_GRAPHQL_VERSION}/pg_graphql-v${PG_GRAPHQL_VERSION}-pg${PG_MAIN_VERSION}-${TARGETARCH}-linux-gnu.deb" -o pg_graphql.deb
RUN dpkg --install pg_graphql.deb RUN dpkg --install pg_graphql.deb
# Install precompiled supabase wrappers extensions
RUN curl -L "https://github.com/supabase/wrappers/releases/download/v${WRAPPERS_VERSION}/wrappers-v${WRAPPERS_VERSION}-pg${PG_MAIN_VERSION}-${TARGETARCH}-linux-gnu.deb" -o wrappers.deb
RUN dpkg --install wrappers.deb
COPY init.sql /docker-entrypoint-initdb.d/ COPY init.sql /docker-entrypoint-initdb.d/

View File

@ -1,6 +1,6 @@
import console from 'console'; import console from 'console';
import { connectionSource, performQuery } from './utils'; import { camelToSnakeCase, connectionSource, performQuery } from './utils';
connectionSource connectionSource
.initialize() .initialize()
@ -18,7 +18,7 @@ connectionSource
'create schema "core"', 'create schema "core"',
); );
await performQuery( await performQuery(
'CREATE EXTENSION IF NOT EXISTS pg_graphql', 'CREATE EXTENSION IF NOT EXISTS "pg_graphql"',
'create extension pg_graphql', 'create extension pg_graphql',
); );
@ -27,6 +27,39 @@ connectionSource
'create extension "uuid-ossp"', 'create extension "uuid-ossp"',
); );
await performQuery(
'CREATE EXTENSION IF NOT EXISTS "postgres_fdw"',
'create extension "postgres_fdw"',
);
await performQuery(
'CREATE EXTENSION IF NOT EXISTS "wrappers"',
'create extension "wrappers"',
);
const supabaseWrappers = [
'airtable',
'bigQuery',
'clickHouse',
'firebase',
'logflare',
's3',
'stripe',
]; // See https://supabase.github.io/wrappers/
for (const wrapper of supabaseWrappers) {
await performQuery(
`
CREATE FOREIGN DATA WRAPPER "${wrapper.toLowerCase()}_fdw"
HANDLER "${camelToSnakeCase(wrapper)}_fdw_handler"
VALIDATOR "${camelToSnakeCase(wrapper)}_fdw_validator";
`,
`create ${wrapper} "wrappers"`,
true,
true,
);
}
await performQuery( await performQuery(
`COMMENT ON SCHEMA "core" IS '@graphql({"inflect_names": true})';`, `COMMENT ON SCHEMA "core" IS '@graphql({"inflect_names": true})';`,
'inflect names for graphql', 'inflect names for graphql',

View File

@ -7,22 +7,36 @@ import { DataSource } from 'typeorm';
config(); config();
const configService = new ConfigService(); const configService = new ConfigService();
export const connectionSource = new DataSource({ export const connectionSource = new DataSource({
type: 'postgres', type: 'postgres',
logging: false, logging: false,
url: configService.get<string>('PG_DATABASE_URL'), url: configService.get<string>('PG_DATABASE_URL'),
}); });
export const camelToSnakeCase = (str) =>
str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
export const performQuery = async ( export const performQuery = async (
query: string, query: string,
consoleDescription: string, consoleDescription: string,
withLog = true, withLog = true,
ignoreAlreadyExistsError = false,
) => { ) => {
try { try {
const result = await connectionSource.query(query); const result = await connectionSource.query(query);
withLog && console.log(`Performed '${consoleDescription}' successfully`); withLog && console.log(`Performed '${consoleDescription}' successfully`);
return result; return result;
} catch (err) { } catch (err) {
withLog && console.error(`Failed to perform '${consoleDescription}':`, err); let message = '';
if (ignoreAlreadyExistsError && `${err}`.includes('already exists')) {
message = `Performed '${consoleDescription}' successfully`;
} else {
message = `Failed to perform '${consoleDescription}': ${err}`;
}
withLog && console.error(message);
} }
}; };