From b70565cabf0d888c4038043cb90262ebdce8f75d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Thu, 26 Jan 2023 00:33:42 +0100 Subject: [PATCH 01/14] remove TestResolvers from previous PR "multiple graphql endpoints" --- .../src/graphql/api/1_0/resolver/Test2Resolver.ts | 12 ------------ .../src/graphql/api/1_0/resolver/TestResolver.ts | 12 ------------ .../src/graphql/api/1_1/resolver/TestResolver.ts | 12 ------------ .../src/graphql/api/2_0/resolver/TestResolver.ts | 12 ------------ 4 files changed, 48 deletions(-) delete mode 100644 federation/src/graphql/api/1_0/resolver/Test2Resolver.ts delete mode 100644 federation/src/graphql/api/1_0/resolver/TestResolver.ts delete mode 100644 federation/src/graphql/api/1_1/resolver/TestResolver.ts delete mode 100644 federation/src/graphql/api/2_0/resolver/TestResolver.ts diff --git a/federation/src/graphql/api/1_0/resolver/Test2Resolver.ts b/federation/src/graphql/api/1_0/resolver/Test2Resolver.ts deleted file mode 100644 index 3388003b8..000000000 --- a/federation/src/graphql/api/1_0/resolver/Test2Resolver.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Query, Resolver } from 'type-graphql' -import { federationLogger as logger } from '@/server/logger' -import { GetTestApiResult } from '../../GetTestApiResult' - -@Resolver() -export class Test2Resolver { - @Query(() => GetTestApiResult) - async test2(): Promise { - logger.info(`test api 2 1_0`) - return new GetTestApiResult('1_0') - } -} diff --git a/federation/src/graphql/api/1_0/resolver/TestResolver.ts b/federation/src/graphql/api/1_0/resolver/TestResolver.ts deleted file mode 100644 index 7291e5ef2..000000000 --- a/federation/src/graphql/api/1_0/resolver/TestResolver.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Field, ObjectType, Query, Resolver } from 'type-graphql' -import { federationLogger as logger } from '@/server/logger' -import { GetTestApiResult } from '../../GetTestApiResult' - -@Resolver() -export class TestResolver { - @Query(() => GetTestApiResult) - async test(): Promise { - logger.info(`test api 1_0`) - return new GetTestApiResult('1_0') - } -} diff --git a/federation/src/graphql/api/1_1/resolver/TestResolver.ts b/federation/src/graphql/api/1_1/resolver/TestResolver.ts deleted file mode 100644 index 8880cad6e..000000000 --- a/federation/src/graphql/api/1_1/resolver/TestResolver.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Field, ObjectType, Query, Resolver } from 'type-graphql' -import { federationLogger as logger } from '@/server/logger' -import { GetTestApiResult } from '../../GetTestApiResult' - -@Resolver() -export class TestResolver { - @Query(() => GetTestApiResult) - async test(): Promise { - logger.info(`test api 1_1`) - return new GetTestApiResult('1_1') - } -} diff --git a/federation/src/graphql/api/2_0/resolver/TestResolver.ts b/federation/src/graphql/api/2_0/resolver/TestResolver.ts deleted file mode 100644 index f50149e33..000000000 --- a/federation/src/graphql/api/2_0/resolver/TestResolver.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Field, ObjectType, Query, Resolver } from 'type-graphql' -import { federationLogger as logger } from '@/server/logger' -import { GetTestApiResult } from '../../GetTestApiResult' - -@Resolver() -export class TestResolver { - @Query(() => GetTestApiResult) - async test(): Promise { - logger.info(`test api 2_0`) - return new GetTestApiResult('2_0') - } -} From a05c2307ee4becd498ec85509d09e213810e5a41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Thu, 26 Jan 2023 00:34:45 +0100 Subject: [PATCH 02/14] add columns to communities table --- backend/src/config/index.ts | 2 +- .../Community.ts | 48 +++++++++++++++++++ database/entity/Community.ts | 2 +- .../0060-update_communities_table.ts | 22 +++++++++ federation/src/config/index.ts | 2 +- 5 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 database/entity/0060-update_communities_table/Community.ts create mode 100644 database/migrations/0060-update_communities_table.ts diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index d010b4ab0..3b8d0d1d6 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -10,7 +10,7 @@ Decimal.set({ }) const constants = { - DB_VERSION: '0059-add_hide_amount_to_users', + DB_VERSION: '0060-update_communities_table', DECAY_START_TIME: new Date('2021-05-13 17:46:31-0000'), // GMT+0 LOG4JS_CONFIG: 'log4js-config.json', // default log level on production should be info diff --git a/database/entity/0060-update_communities_table/Community.ts b/database/entity/0060-update_communities_table/Community.ts new file mode 100644 index 000000000..3a9082667 --- /dev/null +++ b/database/entity/0060-update_communities_table/Community.ts @@ -0,0 +1,48 @@ +import { + BaseEntity, + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, +} from 'typeorm' + +@Entity('communities') +export class Community extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ name: 'foreign', type: 'bool', nullable: false, default: false }) + foreign: boolean + + @Column({ name: 'public_key', type: 'binary', length: 64, default: null, nullable: true }) + publicKey: Buffer + + @Column({ name: 'api_version', length: 10, nullable: false }) + apiVersion: string + + @Column({ name: 'end_point', length: 255, nullable: false }) + endPoint: string + + @Column({ name: 'last_announced_at', type: 'datetime', nullable: false }) + lastAnnouncedAt: Date + + @Column({ name: 'pubkey_verified_at', type: 'datetime', nullable: false }) + pubKeyVerifiedAt: Date + + @CreateDateColumn({ + name: 'created_at', + type: 'datetime', + default: () => 'CURRENT_TIMESTAMP(3)', + nullable: false, + }) + createdAt: Date + + @UpdateDateColumn({ + name: 'updated_at', + type: 'datetime', + onUpdate: 'CURRENT_TIMESTAMP(3)', + nullable: true, + }) + updatedAt: Date | null +} diff --git a/database/entity/Community.ts b/database/entity/Community.ts index 457d03eae..80e5ace30 100644 --- a/database/entity/Community.ts +++ b/database/entity/Community.ts @@ -1 +1 @@ -export { Community } from './0058-add_communities_table/Community' +export { Community } from './0060-update_communities_table/Community' diff --git a/database/migrations/0060-update_communities_table.ts b/database/migrations/0060-update_communities_table.ts new file mode 100644 index 000000000..1047481ee --- /dev/null +++ b/database/migrations/0060-update_communities_table.ts @@ -0,0 +1,22 @@ +/* MIGRATION TO CREATE THE FEDERATION COMMUNITY TABLES + * + * This migration creates the `community` and 'communityfederation' tables in the `apollo` database (`gradido_community`). + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn( + 'ALTER TABLE `communities` ADD COLUMN `foreign` tinyint(4) NOT NULL DEFAULT 0 AFTER `id`;', + ) + await queryFn( + 'ALTER TABLE `communities` ADD COLUMN `pubkey_verified_at` datetime(3) AFTER `last_announced_at`;', + ) +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // write downgrade logic as parameter of queryFn + await queryFn('ALTER TABLE communities DROP COLUMN foreign;') + await queryFn('ALTER TABLE communities DROP COLUMN pubkey_verified_at;') +} diff --git a/federation/src/config/index.ts b/federation/src/config/index.ts index c2d81d2c8..2404c610f 100644 --- a/federation/src/config/index.ts +++ b/federation/src/config/index.ts @@ -11,7 +11,7 @@ Decimal.set({ */ const constants = { - DB_VERSION: '0059-add_hide_amount_to_users', + DB_VERSION: '0060-update_communities_table', // DECAY_START_TIME: new Date('2021-05-13 17:46:31-0000'), // GMT+0 LOG4JS_CONFIG: 'log4js-config.json', // default log level on production should be info From 4e1a6d965e620311c4d2f9678901accaa5299e56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Thu, 26 Jan 2023 00:35:28 +0100 Subject: [PATCH 03/14] create graphql endpoint for GetPublicKey request --- .../api/1_0/model/GetPublicKeyResult.ts | 11 +++++++++++ .../api/1_0/resolver/PublicKeyResolver.ts | 18 ++++++++++++++++++ federation/src/graphql/api/GetTestApiResult.ts | 11 ----------- 3 files changed, 29 insertions(+), 11 deletions(-) create mode 100644 federation/src/graphql/api/1_0/model/GetPublicKeyResult.ts create mode 100644 federation/src/graphql/api/1_0/resolver/PublicKeyResolver.ts delete mode 100644 federation/src/graphql/api/GetTestApiResult.ts diff --git a/federation/src/graphql/api/1_0/model/GetPublicKeyResult.ts b/federation/src/graphql/api/1_0/model/GetPublicKeyResult.ts new file mode 100644 index 000000000..1582ad892 --- /dev/null +++ b/federation/src/graphql/api/1_0/model/GetPublicKeyResult.ts @@ -0,0 +1,11 @@ +import { Field, ObjectType } from 'type-graphql' + +@ObjectType() +export class GetPublicKeyResult { + constructor(pubKey: string) { + this.publicKey = pubKey + } + + @Field(() => String) + publicKey: string +} diff --git a/federation/src/graphql/api/1_0/resolver/PublicKeyResolver.ts b/federation/src/graphql/api/1_0/resolver/PublicKeyResolver.ts new file mode 100644 index 000000000..53f0d0bd4 --- /dev/null +++ b/federation/src/graphql/api/1_0/resolver/PublicKeyResolver.ts @@ -0,0 +1,18 @@ +import { Field, ObjectType, Query, Resolver } from 'type-graphql' +import { federationLogger as logger } from '@/server/logger' +import { Community as DbCommunity } from '@entity/Community' +import { GetPublicKeyResult } from '../model/GetPublicKeyResult' + +@Resolver() +export class PublicKeyResolver { + @Query(() => GetPublicKeyResult) + async getPublicKey(): Promise { + logger.info(`getPublicKey()...`) + const homeCom = await DbCommunity.findOneOrFail({ + foreign: false, + apiVersion: '1_0', + }) + logger.info(`getPublicKey()... with publicKey=${homeCom.publicKey}`) + return new GetPublicKeyResult(homeCom.publicKey.toString()) + } +} diff --git a/federation/src/graphql/api/GetTestApiResult.ts b/federation/src/graphql/api/GetTestApiResult.ts deleted file mode 100644 index 7c8c6c487..000000000 --- a/federation/src/graphql/api/GetTestApiResult.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Field, ObjectType } from 'type-graphql' - -@ObjectType() -export class GetTestApiResult { - constructor(apiVersion: string) { - this.api = apiVersion - } - - @Field(() => String) - api: string -} From ae2097ff71439eab415573420b565c4bf25a321d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Fri, 27 Jan 2023 21:55:43 +0100 Subject: [PATCH 04/14] rename pubkeyVerifiedAt to verifiedAt --- database/entity/0060-update_communities_table/Community.ts | 4 ++-- database/migrations/0060-update_communities_table.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/database/entity/0060-update_communities_table/Community.ts b/database/entity/0060-update_communities_table/Community.ts index 3a9082667..73f098f46 100644 --- a/database/entity/0060-update_communities_table/Community.ts +++ b/database/entity/0060-update_communities_table/Community.ts @@ -27,8 +27,8 @@ export class Community extends BaseEntity { @Column({ name: 'last_announced_at', type: 'datetime', nullable: false }) lastAnnouncedAt: Date - @Column({ name: 'pubkey_verified_at', type: 'datetime', nullable: false }) - pubKeyVerifiedAt: Date + @Column({ name: 'verified_at', type: 'datetime', nullable: false }) + verifiedAt: Date @CreateDateColumn({ name: 'created_at', diff --git a/database/migrations/0060-update_communities_table.ts b/database/migrations/0060-update_communities_table.ts index 1047481ee..1e1b8411e 100644 --- a/database/migrations/0060-update_communities_table.ts +++ b/database/migrations/0060-update_communities_table.ts @@ -11,12 +11,12 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis 'ALTER TABLE `communities` ADD COLUMN `foreign` tinyint(4) NOT NULL DEFAULT 0 AFTER `id`;', ) await queryFn( - 'ALTER TABLE `communities` ADD COLUMN `pubkey_verified_at` datetime(3) AFTER `last_announced_at`;', + 'ALTER TABLE `communities` ADD COLUMN `verified_at` datetime(3) AFTER `last_announced_at`;', ) } export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { // write downgrade logic as parameter of queryFn await queryFn('ALTER TABLE communities DROP COLUMN foreign;') - await queryFn('ALTER TABLE communities DROP COLUMN pubkey_verified_at;') + await queryFn('ALTER TABLE communities DROP COLUMN verified_at;') } From b542f6c81e8a2b1c38e1a394a289851b1b106b9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Tue, 31 Jan 2023 01:02:20 +0100 Subject: [PATCH 05/14] add column last_error_at --- database/entity/0060-update_communities_table/Community.ts | 3 +++ database/migrations/0060-update_communities_table.ts | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/database/entity/0060-update_communities_table/Community.ts b/database/entity/0060-update_communities_table/Community.ts index 73f098f46..227400fdf 100644 --- a/database/entity/0060-update_communities_table/Community.ts +++ b/database/entity/0060-update_communities_table/Community.ts @@ -30,6 +30,9 @@ export class Community extends BaseEntity { @Column({ name: 'verified_at', type: 'datetime', nullable: false }) verifiedAt: Date + @Column({ name: 'last_error_at', type: 'datetime', nullable: false }) + lastErrorAt: Date + @CreateDateColumn({ name: 'created_at', type: 'datetime', diff --git a/database/migrations/0060-update_communities_table.ts b/database/migrations/0060-update_communities_table.ts index 1e1b8411e..55617fd0a 100644 --- a/database/migrations/0060-update_communities_table.ts +++ b/database/migrations/0060-update_communities_table.ts @@ -13,10 +13,14 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis await queryFn( 'ALTER TABLE `communities` ADD COLUMN `verified_at` datetime(3) AFTER `last_announced_at`;', ) + await queryFn( + 'ALTER TABLE `communities` ADD COLUMN `last_error_at` datetime(3) AFTER `verified_at`;', + ) } export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { // write downgrade logic as parameter of queryFn await queryFn('ALTER TABLE communities DROP COLUMN foreign;') await queryFn('ALTER TABLE communities DROP COLUMN verified_at;') + await queryFn('ALTER TABLE communities DROP COLUMN last_error_at;') } From 72f882add3ffade6dd3c0dd67bca0048a1ad987f Mon Sep 17 00:00:00 2001 From: clauspeterhuebner <86960882+clauspeterhuebner@users.noreply.github.com> Date: Tue, 7 Feb 2023 22:34:30 +0100 Subject: [PATCH 06/14] Update database/migrations/0060-update_communities_table.ts Co-authored-by: Moriz Wahl --- database/migrations/0060-update_communities_table.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/migrations/0060-update_communities_table.ts b/database/migrations/0060-update_communities_table.ts index 55617fd0a..1804ee6c7 100644 --- a/database/migrations/0060-update_communities_table.ts +++ b/database/migrations/0060-update_communities_table.ts @@ -8,7 +8,7 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { await queryFn( - 'ALTER TABLE `communities` ADD COLUMN `foreign` tinyint(4) NOT NULL DEFAULT 0 AFTER `id`;', + 'ALTER TABLE `communities` ADD COLUMN `foreign` tinyint(4) NOT NULL DEFAULT 1 AFTER `id`;', ) await queryFn( 'ALTER TABLE `communities` ADD COLUMN `verified_at` datetime(3) AFTER `last_announced_at`;', From fcab712f86468e5a19311f9284acd99a404f3bfd Mon Sep 17 00:00:00 2001 From: clauspeterhuebner <86960882+clauspeterhuebner@users.noreply.github.com> Date: Tue, 7 Feb 2023 22:35:12 +0100 Subject: [PATCH 07/14] Update database/entity/0060-update_communities_table/Community.ts Co-authored-by: Moriz Wahl --- database/entity/0060-update_communities_table/Community.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/entity/0060-update_communities_table/Community.ts b/database/entity/0060-update_communities_table/Community.ts index 227400fdf..d764fc98f 100644 --- a/database/entity/0060-update_communities_table/Community.ts +++ b/database/entity/0060-update_communities_table/Community.ts @@ -12,7 +12,7 @@ export class Community extends BaseEntity { @PrimaryGeneratedColumn('increment', { unsigned: true }) id: number - @Column({ name: 'foreign', type: 'bool', nullable: false, default: false }) + @Column({ name: 'foreign', type: 'bool', nullable: false, default: true }) foreign: boolean @Column({ name: 'public_key', type: 'binary', length: 64, default: null, nullable: true }) From 4510a8dc085f2b15029eb40eeff4ad151d49cf26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Mon, 27 Feb 2023 19:59:07 +0100 Subject: [PATCH 08/14] define nginx for federation --- .../sites-available/gradido.conf.template | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/deployment/bare_metal/nginx/sites-available/gradido.conf.template b/deployment/bare_metal/nginx/sites-available/gradido.conf.template index b4c7b3463..2447a439a 100644 --- a/deployment/bare_metal/nginx/sites-available/gradido.conf.template +++ b/deployment/bare_metal/nginx/sites-available/gradido.conf.template @@ -98,6 +98,52 @@ server { error_log $GRADIDO_LOG_PATH/nginx-error.admin.log warn; } + # Federation + location /graphql { + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $host; + + proxy_pass http://127.0.0.1:5010; + proxy_redirect off; + + access_log $GRADIDO_LOG_PATH/nginx-access.federation-5010.log gradido_log; + error_log $GRADIDO_LOG_PATH/nginx-error.federation-5010.log warn; + } + + location /graphql { + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $host; + + proxy_pass http://127.0.0.1:5011; + proxy_redirect off; + + access_log $GRADIDO_LOG_PATH/nginx-access.federation-5011.log gradido_log; + error_log $GRADIDO_LOG_PATH/nginx-error.federation-5011.log warn; + } + + location /graphql { + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $host; + + proxy_pass http://127.0.0.1:5020; + proxy_redirect off; + + access_log $GRADIDO_LOG_PATH/nginx-access.federation-5020.log gradido_log; + error_log $GRADIDO_LOG_PATH/nginx-error.federation-5020.log warn; + } + # TODO this could be a performance optimization #location /vue { # alias /var/www/html/gradido/frontend/dist; From 9c7b98fa700fdad386491c668cdfba6a5ff972fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Mon, 27 Feb 2023 20:01:28 +0100 Subject: [PATCH 09/14] log-output for mismatching received publicKey --- backend/src/federation/validateCommunities.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/backend/src/federation/validateCommunities.ts b/backend/src/federation/validateCommunities.ts index f5a0c50ac..903ceb68b 100644 --- a/backend/src/federation/validateCommunities.ts +++ b/backend/src/federation/validateCommunities.ts @@ -44,13 +44,12 @@ export async function validateCommunities(): Promise { logger.info(`Federation: matching publicKey: ${pubKey}`) DbCommunity.update({ id: dbCom.id }, { verifiedAt: new Date() }) logger.debug(`Federation: updated dbCom: ${JSON.stringify(dbCom)}`) + } else { + logger.warn( + `Federation: received not matching publicKey -> received: ${pubKey}, expected: ${dbCom.publicKey} `, + ) + // DbCommunity.delete({ id: dbCom.id }) } - /* - else { - logger.warn(`Federation: received unknown publicKey -> delete dbCom with id=${dbCom.id} `) - DbCommunity.delete({ id: dbCom.id }) - } - */ } catch (err) { if (!isLogError(err)) { logger.error(`Error:`, err) From 8104bd6b4a5c93ad5463ed2dc1f3a595f9197ba5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Mon, 27 Feb 2023 20:02:41 +0100 Subject: [PATCH 10/14] multi singleton instance handling depending on endpoint --- .../src/federation/client/GraphQLGetClient.ts | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/backend/src/federation/client/GraphQLGetClient.ts b/backend/src/federation/client/GraphQLGetClient.ts index 7e2d89b6c..8086a95fa 100644 --- a/backend/src/federation/client/GraphQLGetClient.ts +++ b/backend/src/federation/client/GraphQLGetClient.ts @@ -1,8 +1,14 @@ import { GraphQLClient } from 'graphql-request' import { PatchedRequestInit } from 'graphql-request/dist/types' +type ClientInstance = { + url: string + // eslint-disable-next-line no-use-before-define + client: GraphQLGetClient +} + export class GraphQLGetClient extends GraphQLClient { - private static instance: GraphQLGetClient + private static instanceArray: ClientInstance[] = [] /** * The Singleton's constructor should always be private to prevent direct @@ -20,16 +26,19 @@ export class GraphQLGetClient extends GraphQLClient { * just one instance of each subclass around. */ public static getInstance(url: string): GraphQLGetClient { - if (!GraphQLGetClient.instance) { - GraphQLGetClient.instance = new GraphQLGetClient(url, { - method: 'GET', - jsonSerializer: { - parse: JSON.parse, - stringify: JSON.stringify, - }, - }) - } - - return GraphQLGetClient.instance + GraphQLGetClient.instanceArray.forEach(function (instance) { + if (instance.url === url) { + return instance.client + } + }) + const client = new GraphQLGetClient(url, { + method: 'GET', + jsonSerializer: { + parse: JSON.parse, + stringify: JSON.stringify, + }, + }) + GraphQLGetClient.instanceArray.push({ url, client } as ClientInstance) + return client } } From d987fa9ab4958c10df6d6ddc73866b24af268102 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Mon, 27 Feb 2023 20:03:22 +0100 Subject: [PATCH 11/14] solve request body password error --- backend/src/federation/client/1_0/FederationClient.ts | 6 +++++- backend/src/federation/client/1_1/FederationClient.ts | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/backend/src/federation/client/1_0/FederationClient.ts b/backend/src/federation/client/1_0/FederationClient.ts index 1c0ec4996..a8d7e1dff 100644 --- a/backend/src/federation/client/1_0/FederationClient.ts +++ b/backend/src/federation/client/1_0/FederationClient.ts @@ -18,9 +18,13 @@ export async function requestGetPublicKey(dbCom: DbCommunity): Promise Date: Mon, 27 Feb 2023 20:29:49 +0100 Subject: [PATCH 12/14] configure nginx for federation --- .../sites-available/gradido.conf.ssl.template | 46 +++++++++++++++++++ .../sites-available/gradido.conf.template | 6 +-- 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/deployment/bare_metal/nginx/sites-available/gradido.conf.ssl.template b/deployment/bare_metal/nginx/sites-available/gradido.conf.ssl.template index aade0429b..e179109c8 100644 --- a/deployment/bare_metal/nginx/sites-available/gradido.conf.ssl.template +++ b/deployment/bare_metal/nginx/sites-available/gradido.conf.ssl.template @@ -112,6 +112,52 @@ server { error_log $GRADIDO_LOG_PATH/nginx-error.admin.log warn; } + # Federation + location /federation-5010 { + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $host; + + proxy_pass http://127.0.0.1:5010; + proxy_redirect off; + + access_log $GRADIDO_LOG_PATH/nginx-access.federation-5010.log gradido_log; + error_log $GRADIDO_LOG_PATH/nginx-error.federation-5010.log warn; + } + + location /federation-5011 { + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $host; + + proxy_pass http://127.0.0.1:5011; + proxy_redirect off; + + access_log $GRADIDO_LOG_PATH/nginx-access.federation-5011.log gradido_log; + error_log $GRADIDO_LOG_PATH/nginx-error.federation-5011.log warn; + } + + location /federation-5020 { + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $host; + + proxy_pass http://127.0.0.1:5020; + proxy_redirect off; + + access_log $GRADIDO_LOG_PATH/nginx-access.federation-5020.log gradido_log; + error_log $GRADIDO_LOG_PATH/nginx-error.federation-5020.log warn; + } + # TODO this could be a performance optimization #location /vue { # alias /var/www/html/gradido/frontend/dist; diff --git a/deployment/bare_metal/nginx/sites-available/gradido.conf.template b/deployment/bare_metal/nginx/sites-available/gradido.conf.template index 2447a439a..80fe963d5 100644 --- a/deployment/bare_metal/nginx/sites-available/gradido.conf.template +++ b/deployment/bare_metal/nginx/sites-available/gradido.conf.template @@ -99,7 +99,7 @@ server { } # Federation - location /graphql { + location /federation-5010 { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; @@ -114,7 +114,7 @@ server { error_log $GRADIDO_LOG_PATH/nginx-error.federation-5010.log warn; } - location /graphql { + location /federation-5011 { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; @@ -129,7 +129,7 @@ server { error_log $GRADIDO_LOG_PATH/nginx-error.federation-5011.log warn; } - location /graphql { + location /federation-5020 { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; From 3bb0ff978bb97c46c4e725352c45f037de636a3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Tue, 28 Feb 2023 15:52:59 +0100 Subject: [PATCH 13/14] correct nginx locations --- .../nginx/sites-available/gradido.conf.ssl.template | 6 +++--- .../bare_metal/nginx/sites-available/gradido.conf.template | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/deployment/bare_metal/nginx/sites-available/gradido.conf.ssl.template b/deployment/bare_metal/nginx/sites-available/gradido.conf.ssl.template index e179109c8..71885d29b 100644 --- a/deployment/bare_metal/nginx/sites-available/gradido.conf.ssl.template +++ b/deployment/bare_metal/nginx/sites-available/gradido.conf.ssl.template @@ -113,7 +113,7 @@ server { } # Federation - location /federation-5010 { + location /api/1_0 { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; @@ -128,7 +128,7 @@ server { error_log $GRADIDO_LOG_PATH/nginx-error.federation-5010.log warn; } - location /federation-5011 { + location /api/1_1 { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; @@ -143,7 +143,7 @@ server { error_log $GRADIDO_LOG_PATH/nginx-error.federation-5011.log warn; } - location /federation-5020 { + location /api/2_0 { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; diff --git a/deployment/bare_metal/nginx/sites-available/gradido.conf.template b/deployment/bare_metal/nginx/sites-available/gradido.conf.template index 80fe963d5..b3c493c43 100644 --- a/deployment/bare_metal/nginx/sites-available/gradido.conf.template +++ b/deployment/bare_metal/nginx/sites-available/gradido.conf.template @@ -99,7 +99,7 @@ server { } # Federation - location /federation-5010 { + location /api/1_0 { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; @@ -114,7 +114,7 @@ server { error_log $GRADIDO_LOG_PATH/nginx-error.federation-5010.log warn; } - location /federation-5011 { + location /api/1_1 { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; @@ -129,7 +129,7 @@ server { error_log $GRADIDO_LOG_PATH/nginx-error.federation-5011.log warn; } - location /federation-5020 { + location /api/2_0 { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; From ee728ffd7901acfef9bf9fb4dbe21488327ee209 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Mon, 6 Mar 2023 15:08:00 +0100 Subject: [PATCH 14/14] remove 'hex' at comparing the publicKey --- backend/src/federation/validateCommunities.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/federation/validateCommunities.ts b/backend/src/federation/validateCommunities.ts index 903ceb68b..c06b2fd72 100644 --- a/backend/src/federation/validateCommunities.ts +++ b/backend/src/federation/validateCommunities.ts @@ -40,7 +40,7 @@ export async function validateCommunities(): Promise { logger.info( `Federation: received publicKey=${pubKey} from endpoint=${dbCom.endPoint}/${dbCom.apiVersion}`, ) - if (pubKey && pubKey === dbCom.publicKey.toString('hex')) { + if (pubKey && pubKey === dbCom.publicKey.toString()) { logger.info(`Federation: matching publicKey: ${pubKey}`) DbCommunity.update({ id: dbCom.id }, { verifiedAt: new Date() }) logger.debug(`Federation: updated dbCom: ${JSON.stringify(dbCom)}`)