gergo/serverMigration (#2067)
* feat: add server migration data to server info * chore: gqlcodegen
This commit is contained in:
@@ -2,6 +2,11 @@ extend type Query {
|
||||
serverInfo: ServerInfo!
|
||||
}
|
||||
|
||||
type ServerMigration {
|
||||
movedFrom: String
|
||||
movedTo: String
|
||||
}
|
||||
|
||||
"""
|
||||
Information about this server.
|
||||
"""
|
||||
@@ -25,6 +30,10 @@ type ServerInfo {
|
||||
Base URL of Speckle Automate, if set
|
||||
"""
|
||||
automateUrl: String
|
||||
"""
|
||||
Server relocation / migration info
|
||||
"""
|
||||
migration: ServerMigration
|
||||
}
|
||||
|
||||
type Role {
|
||||
|
||||
@@ -2089,6 +2089,8 @@ export type ServerInfo = {
|
||||
description?: Maybe<Scalars['String']>;
|
||||
guestModeEnabled: Scalars['Boolean'];
|
||||
inviteOnly?: Maybe<Scalars['Boolean']>;
|
||||
/** Server relocation / migration info */
|
||||
migration?: Maybe<ServerMigration>;
|
||||
name: Scalars['String'];
|
||||
/** @deprecated Use role constants from the @speckle/shared npm package instead */
|
||||
roles: Array<Role>;
|
||||
@@ -2122,6 +2124,12 @@ export type ServerInviteCreateInput = {
|
||||
serverRole?: InputMaybe<Scalars['String']>;
|
||||
};
|
||||
|
||||
export type ServerMigration = {
|
||||
__typename?: 'ServerMigration';
|
||||
movedFrom?: Maybe<Scalars['String']>;
|
||||
movedTo?: Maybe<Scalars['String']>;
|
||||
};
|
||||
|
||||
export enum ServerRole {
|
||||
ServerAdmin = 'SERVER_ADMIN',
|
||||
ServerArchivedUser = 'SERVER_ARCHIVED_USER',
|
||||
@@ -3122,6 +3130,7 @@ export type ResolversTypes = {
|
||||
ServerInfoUpdateInput: ServerInfoUpdateInput;
|
||||
ServerInvite: ResolverTypeWrapper<ServerInviteGraphQLReturnType>;
|
||||
ServerInviteCreateInput: ServerInviteCreateInput;
|
||||
ServerMigration: ResolverTypeWrapper<ServerMigration>;
|
||||
ServerRole: ServerRole;
|
||||
ServerRoleItem: ResolverTypeWrapper<ServerRoleItem>;
|
||||
ServerStatistics: ResolverTypeWrapper<GraphQLEmptyReturn>;
|
||||
@@ -3289,6 +3298,7 @@ export type ResolversParentTypes = {
|
||||
ServerInfoUpdateInput: ServerInfoUpdateInput;
|
||||
ServerInvite: ServerInviteGraphQLReturnType;
|
||||
ServerInviteCreateInput: ServerInviteCreateInput;
|
||||
ServerMigration: ServerMigration;
|
||||
ServerRoleItem: ServerRoleItem;
|
||||
ServerStatistics: GraphQLEmptyReturn;
|
||||
ServerStats: ServerStats;
|
||||
@@ -4071,6 +4081,7 @@ export type ServerInfoResolvers<ContextType = GraphQLContext, ParentType extends
|
||||
description?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
|
||||
guestModeEnabled?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType>;
|
||||
inviteOnly?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
|
||||
migration?: Resolver<Maybe<ResolversTypes['ServerMigration']>, ParentType, ContextType>;
|
||||
name?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
|
||||
roles?: Resolver<Array<ResolversTypes['Role']>, ParentType, ContextType>;
|
||||
scopes?: Resolver<Array<ResolversTypes['Scope']>, ParentType, ContextType>;
|
||||
@@ -4087,6 +4098,12 @@ export type ServerInviteResolvers<ContextType = GraphQLContext, ParentType exten
|
||||
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
|
||||
};
|
||||
|
||||
export type ServerMigrationResolvers<ContextType = GraphQLContext, ParentType extends ResolversParentTypes['ServerMigration'] = ResolversParentTypes['ServerMigration']> = {
|
||||
movedFrom?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
|
||||
movedTo?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
|
||||
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
|
||||
};
|
||||
|
||||
export type ServerRoleItemResolvers<ContextType = GraphQLContext, ParentType extends ResolversParentTypes['ServerRoleItem'] = ResolversParentTypes['ServerRoleItem']> = {
|
||||
id?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
|
||||
title?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
|
||||
@@ -4411,6 +4428,7 @@ export type Resolvers<ContextType = GraphQLContext> = {
|
||||
ServerAppListItem?: ServerAppListItemResolvers<ContextType>;
|
||||
ServerInfo?: ServerInfoResolvers<ContextType>;
|
||||
ServerInvite?: ServerInviteResolvers<ContextType>;
|
||||
ServerMigration?: ServerMigrationResolvers<ContextType>;
|
||||
ServerRoleItem?: ServerRoleItemResolvers<ContextType>;
|
||||
ServerStatistics?: ServerStatisticsResolvers<ContextType>;
|
||||
ServerStats?: ServerStatsResolvers<ContextType>;
|
||||
|
||||
@@ -82,6 +82,7 @@ export type ServerInfo = ServerConfigRecord & {
|
||||
* Dynamically resolved from env vars
|
||||
*/
|
||||
version: string
|
||||
migration?: { movedFrom?: string; movedTo?: string }
|
||||
}
|
||||
|
||||
export type CommitRecord = {
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
'use strict'
|
||||
const knex = require('@/db/knex')
|
||||
const {
|
||||
getServerVersion,
|
||||
getServerOrigin,
|
||||
getServerMovedTo,
|
||||
getServerMovedFrom
|
||||
} = require('@/modules/shared/helpers/envHelper')
|
||||
|
||||
const Roles = () => knex('user_roles')
|
||||
const Scopes = () => knex('scopes')
|
||||
@@ -11,8 +17,11 @@ module.exports = {
|
||||
*/
|
||||
async getServerInfo() {
|
||||
const serverInfo = await Info().select('*').first()
|
||||
serverInfo.version = process.env.SPECKLE_SERVER_VERSION || 'dev'
|
||||
serverInfo.canonicalUrl = process.env.CANONICAL_URL || '127.0.0.1'
|
||||
serverInfo.version = getServerVersion()
|
||||
serverInfo.canonicalUrl = getServerOrigin()
|
||||
const movedTo = getServerMovedTo()
|
||||
const movedFrom = getServerMovedFrom()
|
||||
if (movedTo || movedFrom) serverInfo.migration = { movedTo, movedFrom }
|
||||
return serverInfo
|
||||
},
|
||||
|
||||
|
||||
@@ -2079,6 +2079,8 @@ export type ServerInfo = {
|
||||
description?: Maybe<Scalars['String']>;
|
||||
guestModeEnabled: Scalars['Boolean'];
|
||||
inviteOnly?: Maybe<Scalars['Boolean']>;
|
||||
/** Server relocation / migration info */
|
||||
migration?: Maybe<ServerMigration>;
|
||||
name: Scalars['String'];
|
||||
/** @deprecated Use role constants from the @speckle/shared npm package instead */
|
||||
roles: Array<Role>;
|
||||
@@ -2112,6 +2114,12 @@ export type ServerInviteCreateInput = {
|
||||
serverRole?: InputMaybe<Scalars['String']>;
|
||||
};
|
||||
|
||||
export type ServerMigration = {
|
||||
__typename?: 'ServerMigration';
|
||||
movedFrom?: Maybe<Scalars['String']>;
|
||||
movedTo?: Maybe<Scalars['String']>;
|
||||
};
|
||||
|
||||
export enum ServerRole {
|
||||
ServerAdmin = 'SERVER_ADMIN',
|
||||
ServerArchivedUser = 'SERVER_ARCHIVED_USER',
|
||||
|
||||
@@ -160,6 +160,28 @@ export function isSSLServer() {
|
||||
return /^https:\/\//.test(getBaseUrl())
|
||||
}
|
||||
|
||||
function parseUrlVar(value: string, name: string) {
|
||||
try {
|
||||
return new URL(value)
|
||||
} catch (err: unknown) {
|
||||
if (err instanceof TypeError && err.message === 'Invalid URL')
|
||||
throw new MisconfiguredEnvironmentError(`${name} has to be a valid URL`)
|
||||
throw err
|
||||
}
|
||||
}
|
||||
|
||||
export function getServerMovedFrom() {
|
||||
const value = process.env.MIGRATION_SERVER_MOVED_FROM
|
||||
if (!value) return value
|
||||
return parseUrlVar(value, 'MIGRATION_SERVER_MOVED_FROM')
|
||||
}
|
||||
|
||||
export function getServerMovedTo() {
|
||||
const value = process.env.MIGRATION_SERVER_MOVED_TO
|
||||
if (!value) return value
|
||||
return parseUrlVar(value, 'MIGRATION_SERVER_MOVED_TO')
|
||||
}
|
||||
|
||||
export function adminOverrideEnabled() {
|
||||
return process.env.ADMIN_OVERRIDE_ENABLED === 'true'
|
||||
}
|
||||
|
||||
@@ -2080,6 +2080,8 @@ export type ServerInfo = {
|
||||
description?: Maybe<Scalars['String']>;
|
||||
guestModeEnabled: Scalars['Boolean'];
|
||||
inviteOnly?: Maybe<Scalars['Boolean']>;
|
||||
/** Server relocation / migration info */
|
||||
migration?: Maybe<ServerMigration>;
|
||||
name: Scalars['String'];
|
||||
/** @deprecated Use role constants from the @speckle/shared npm package instead */
|
||||
roles: Array<Role>;
|
||||
@@ -2113,6 +2115,12 @@ export type ServerInviteCreateInput = {
|
||||
serverRole?: InputMaybe<Scalars['String']>;
|
||||
};
|
||||
|
||||
export type ServerMigration = {
|
||||
__typename?: 'ServerMigration';
|
||||
movedFrom?: Maybe<Scalars['String']>;
|
||||
movedTo?: Maybe<Scalars['String']>;
|
||||
};
|
||||
|
||||
export enum ServerRole {
|
||||
ServerAdmin = 'SERVER_ADMIN',
|
||||
ServerArchivedUser = 'SERVER_ARCHIVED_USER',
|
||||
|
||||
@@ -131,6 +131,17 @@ spec:
|
||||
- name: SPECKLE_AUTOMATE_URL
|
||||
value: {{ .Values.server.speckleAutomateUrl }}
|
||||
|
||||
|
||||
{{- if .Values.server.migration.movedFrom }}
|
||||
- name: MIGRATION_SERVER_MOVED_FROM
|
||||
value: {{ .Values.server.migration.movedFrom }}
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.server.migration.movedTo }}
|
||||
- name: MIGRATION_SERVER_MOVED_TO
|
||||
value: {{ .Values.server.migration.movedTo }}
|
||||
{{- end }}
|
||||
|
||||
# *** Redis ***
|
||||
- name: REDIS_URL
|
||||
valueFrom:
|
||||
|
||||
@@ -983,6 +983,21 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"migration": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"movedFrom": {
|
||||
"type": "string",
|
||||
"description": "Indicate the URL where the server moved from",
|
||||
"default": ""
|
||||
},
|
||||
"movedTo": {
|
||||
"type": "string",
|
||||
"description": "Indicate the URL where the server moved to",
|
||||
"default": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"monitoring": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
|
||||
@@ -647,6 +647,12 @@ server:
|
||||
## @param server.fileUploads.enabled If enabled, file uploads on the server will be flagged as enabled
|
||||
enabled: true
|
||||
|
||||
migration:
|
||||
## @param server.migration.movedFrom Indicate the URL where the server moved from
|
||||
movedFrom: ''
|
||||
## @param server.migration.movedTo Indicate the URL where the server moved to
|
||||
movedTo: ''
|
||||
|
||||
monitoring:
|
||||
apollo:
|
||||
## @param server.monitoring.apollo.enabled (Optional) If enabled, exports metrics from the GraphQL API to Apollo Graphql Studio.
|
||||
|
||||
Reference in New Issue
Block a user