Compare commits

..

10 Commits

Author SHA1 Message Date
github-actions[bot]
5e91221d5a chore: update versions (#2672)
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @nhost/dashboard@1.13.3

### Patch Changes

-   5924bc3: fix: include password in `GetSmtpSettings` query
- c5ad634: fix: resolved an issue where one-click install links were
broken on Safari
- 7278991: fix: update graphql auto-embeddings configuration to use
String type for model field

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-04-18 15:49:01 +01:00
Hassan Ben Jobrane
7278991a59 fix: dashboard: update graphql auto-embeddings configuration to use String type for model field (#2674) 2024-04-18 15:22:32 +01:00
Hassan Ben Jobrane
5924bc3248 fix: dashboard: include password in GetSmtpSettings query (#2673) 2024-04-18 15:14:02 +01:00
Hassan Ben Jobrane
c5ad634799 fix: dashboard: check for undefined router query on Safari when accessing base64config (#2671) 2024-04-18 10:04:18 +01:00
github-actions[bot]
426b93a19f chore: update versions (#2670)
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @nhost/dashboard@1.13.2

### Patch Changes

-   026f84f: fix: use configuration server URL from environment variable

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-04-17 14:15:04 +01:00
Hassan Ben Jobrane
026f84f466 fix: dashboard: use config server url from env variable (#2669)
related to https://github.com/nhost/cli/issues/862
2024-04-17 14:02:11 +01:00
github-actions[bot]
384fac00b1 chore: update versions (#2664)
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @nhost/dashboard@1.13.1

### Patch Changes

-   7e9a2ce: fix: resolve issue where run services form fails to open

## @nhost/docs@2.10.1

### Patch Changes

-   9525fd7: fix: update AI docs for 0.5.0
-   076fd4a: fix: update permissions page to indicate we use jsonpath

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-04-16 10:53:36 +01:00
Hassan Ben Jobrane
7e9a2ce136 fix: dashboard: fix isPlatform check when opening run services form (#2666) 2024-04-16 10:38:28 +01:00
David Barroso
076fd4a7c0 fix (docs): update permissions page to indicate we use jsonpath (#2663) 2024-04-15 14:50:21 +02:00
David Barroso
9525fd74b3 fix (docs): update AI docs for 0.5.0 (#2662) 2024-04-15 14:33:59 +02:00
20 changed files with 138 additions and 437 deletions

View File

@@ -1,5 +1,25 @@
# @nhost/dashboard
## 1.13.3
### Patch Changes
- 5924bc3: fix: include password in `GetSmtpSettings` query
- c5ad634: fix: resolved an issue where one-click install links were broken on Safari
- 7278991: fix: update graphql auto-embeddings configuration to use String type for model field
## 1.13.2
### Patch Changes
- 026f84f: fix: use configuration server URL from environment variable
## 1.13.1
### Patch Changes
- 7e9a2ce: fix: resolve issue where run services form fails to open
## 1.13.0
### Minor Changes

View File

@@ -28,6 +28,7 @@ ENV NEXT_PUBLIC_NHOST_STORAGE_URL __NEXT_PUBLIC_NHOST_STORAGE_URL__
ENV NEXT_PUBLIC_NHOST_HASURA_CONSOLE_URL __NEXT_PUBLIC_NHOST_HASURA_CONSOLE_URL__
ENV NEXT_PUBLIC_NHOST_HASURA_MIGRATIONS_API_URL __NEXT_PUBLIC_NHOST_HASURA_MIGRATIONS_API_URL__
ENV NEXT_PUBLIC_NHOST_HASURA_API_URL __NEXT_PUBLIC_NHOST_HASURA_API_URL__
ENV NEXT_PUBLIC_NHOST_CONFIGSERVER_URL __NEXT_PUBLIC_NHOST_CONFIGSERVER_URL__
RUN yarn global add pnpm@8.10.5
COPY .gitignore .gitignore

View File

@@ -21,5 +21,6 @@ find dashboard -type f -exec sed -i "s~__NEXT_PUBLIC_NHOST_STORAGE_URL__~${NEXT_
find dashboard -type f -exec sed -i "s~__NEXT_PUBLIC_NHOST_HASURA_CONSOLE_URL__~${NEXT_PUBLIC_NHOST_HASURA_CONSOLE_URL}~g" {} +
find dashboard -type f -exec sed -i "s~__NEXT_PUBLIC_NHOST_HASURA_MIGRATIONS_API_URL__~${NEXT_PUBLIC_NHOST_HASURA_MIGRATIONS_API_URL}~g" {} +
find dashboard -type f -exec sed -i "s~__NEXT_PUBLIC_NHOST_HASURA_API_URL__~${NEXT_PUBLIC_NHOST_HASURA_API_URL}~g" {} +
find dashboard -type f -exec sed -i "s~__NEXT_PUBLIC_NHOST_CONFIGSERVER_URL__~${NEXT_PUBLIC_NHOST_CONFIGSERVER_URL}~g" {} +
exec "$@"

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost/dashboard",
"version": "1.13.0",
"version": "1.13.3",
"private": true,
"scripts": {
"preinstall": "npx only-allow pnpm",

View File

@@ -12,6 +12,7 @@ query GetSmtpSettings($appId: uuid!) {
secure
sender
user
password
}
}
}

View File

@@ -1,6 +1,6 @@
mutation insertGraphiteAutoEmbeddingsConfiguration(
$name: String
$model: embedding_model_enum
$model: String
$schemaName: String
$tableName: String
$columnName: String

View File

@@ -1,7 +1,7 @@
mutation updateGraphiteAutoEmbeddingsConfiguration(
$id: uuid!
$name: String
$model: embedding_model_enum
$model: String
$schemaName: String
$tableName: String
$columnName: String

View File

@@ -1,3 +1,4 @@
import { getConfigServerUrl } from '@/utils/env';
import { ApolloClient, HttpLink, InMemoryCache } from '@apollo/client';
import { useMemo } from 'react';
@@ -11,7 +12,7 @@ export default function useLocalMimirClient() {
new ApolloClient({
cache: new InMemoryCache(),
link: new HttpLink({
uri: 'https://local.dashboard.nhost.run/v1/configserver/graphql',
uri: getConfigServerUrl(),
}),
}),
[],

View File

@@ -97,7 +97,7 @@ export default function ServicesPage() {
const openCreateServiceDialog = () => {
// creating services using the local dashboard is not supported
if (isPlatform) {
if (!isPlatform) {
return;
}

View File

@@ -60,7 +60,7 @@ export default function SMTPSettingsPage() {
...(!isPlatform ? { client: localMimirClient } : {}),
});
const { secure, host, port, user, method, sender } =
const { secure, host, port, user, method, sender, password } =
data?.config?.provider?.smtp || {};
const form = useForm<Optional<SmtpFormValues, 'password'>>({
@@ -71,6 +71,7 @@ export default function SMTPSettingsPage() {
host: '',
port: undefined,
user: '',
password: '',
method: '',
sender: '',
},
@@ -79,6 +80,7 @@ export default function SMTPSettingsPage() {
host: host || '',
port,
user: user || '',
password: password || '',
method: method || '',
sender: sender || '',
},
@@ -122,14 +124,14 @@ export default function SMTPSettingsPage() {
}
const handleEditSMTPSettings = async (values: SmtpFormValues) => {
const { password, ...valuesWithoutPassword } = values;
const { password: newPassword, ...valuesWithoutPassword } = values;
const updateConfigPromise = updateConfig({
variables: {
appId: currentProject.id,
config: {
provider: {
smtp: password ? values : valuesWithoutPassword,
smtp: newPassword ? values : valuesWithoutPassword,
},
},
},

View File

@@ -82,7 +82,11 @@ export default function SelectWorkspaceAndProject() {
);
useEffect(() => {
checkConfigFromQuery(router.query?.config as string);
const config = router.query?.config as string;
if (config) {
checkConfigFromQuery(router.query?.config as string);
}
}, [checkConfigFromQuery, router.query]);
const goToServices = async (project: {
@@ -133,7 +137,7 @@ export default function SelectWorkspaceAndProject() {
if (loading) {
return (
<div className="flex w-full justify-center">
<div className="flex justify-center w-full">
<ActivityIndicator
delay={500}
label="Loading workspaces and projects..."
@@ -156,7 +160,7 @@ export default function SelectWorkspaceAndProject() {
/>
<div>
<div className="mb-2 flex w-full">
<div className="flex w-full mb-2">
<Input
placeholder="Search..."
onChange={handleFilterChange}
@@ -166,11 +170,11 @@ export default function SelectWorkspaceAndProject() {
</div>
<RetryableErrorBoundary>
{projectsToDisplay.length === 0 ? (
<Box className="h-import py-2">
<Box className="py-2 h-import">
<Text variant="subtitle2">No results found.</Text>
</Box>
) : (
<List className="h-import overflow-y-auto">
<List className="overflow-y-auto h-import">
{projectsToDisplay.map((project, index) => (
<Fragment key={project.value}>
<ListItem.Root
@@ -186,7 +190,7 @@ export default function SelectWorkspaceAndProject() {
}
>
<ListItem.Avatar>
<span className="inline-block h-6 w-6 overflow-hidden rounded-md">
<span className="inline-block w-6 h-6 overflow-hidden rounded-md">
<Image
src="/logos/new.svg"
alt="Nhost Logo"

View File

@@ -16,9 +16,7 @@ export type Scalars = {
bigint: any;
bytea: any;
citext: any;
embedding_model_enum: any;
jsonb: any;
timestamp: any;
timestamptz: any;
timestampz: any;
uuid: any;
@@ -1547,9 +1545,9 @@ export type AuthUserProviders_Bool_Exp = {
export enum AuthUserProviders_Constraint {
/** unique or primary key constraint on columns "id" */
UserProvidersPkey = 'user_providers_pkey',
/** unique or primary key constraint on columns "provider_id", "provider_user_id" */
/** unique or primary key constraint on columns "provider_user_id", "provider_id" */
UserProvidersProviderIdProviderUserIdKey = 'user_providers_provider_id_provider_user_id_key',
/** unique or primary key constraint on columns "provider_id", "user_id" */
/** unique or primary key constraint on columns "user_id", "provider_id" */
UserProvidersUserIdProviderIdKey = 'user_providers_user_id_provider_id_key'
}
@@ -2684,19 +2682,6 @@ export enum Cursor_Ordering {
Desc = 'DESC'
}
/** Boolean expression to compare columns of type "embedding_model_enum". All fields are combined with logical 'AND'. */
export type Embedding_Model_Enum_Comparison_Exp = {
_eq?: InputMaybe<Scalars['embedding_model_enum']>;
_gt?: InputMaybe<Scalars['embedding_model_enum']>;
_gte?: InputMaybe<Scalars['embedding_model_enum']>;
_in?: InputMaybe<Array<Scalars['embedding_model_enum']>>;
_is_null?: InputMaybe<Scalars['Boolean']>;
_lt?: InputMaybe<Scalars['embedding_model_enum']>;
_lte?: InputMaybe<Scalars['embedding_model_enum']>;
_neq?: InputMaybe<Scalars['embedding_model_enum']>;
_nin?: InputMaybe<Array<Scalars['embedding_model_enum']>>;
};
/** columns and relationships of "storage.files" */
export type Files = {
__typename?: 'files';
@@ -3297,7 +3282,7 @@ export type GraphiteAutoEmbeddingsConfiguration = {
createdAt: Scalars['timestamptz'];
id: Scalars['uuid'];
lastRun?: Maybe<Scalars['timestamptz']>;
model: Scalars['embedding_model_enum'];
model: Scalars['String'];
mutation?: Maybe<Scalars['String']>;
name: Scalars['String'];
query?: Maybe<Scalars['String']>;
@@ -3337,7 +3322,7 @@ export type GraphiteAutoEmbeddingsConfiguration_Bool_Exp = {
createdAt?: InputMaybe<Timestamptz_Comparison_Exp>;
id?: InputMaybe<Uuid_Comparison_Exp>;
lastRun?: InputMaybe<Timestamptz_Comparison_Exp>;
model?: InputMaybe<Embedding_Model_Enum_Comparison_Exp>;
model?: InputMaybe<String_Comparison_Exp>;
mutation?: InputMaybe<String_Comparison_Exp>;
name?: InputMaybe<String_Comparison_Exp>;
query?: InputMaybe<String_Comparison_Exp>;
@@ -3352,7 +3337,7 @@ export enum GraphiteAutoEmbeddingsConfiguration_Constraint {
AutoEmbeddingsConfigurationNameKey = 'auto_embeddings_configuration_name_key',
/** unique or primary key constraint on columns "id" */
AutoEmbeddingsConfigurationPkey = 'auto_embeddings_configuration_pkey',
/** unique or primary key constraint on columns "table_name", "column_name", "schema_name" */
/** unique or primary key constraint on columns "column_name", "schema_name", "table_name" */
AutoEmbeddingsConfigurationSchemaNameTableNameColumnKey = 'auto_embeddings_configuration_schema_name_table_name_column_key'
}
@@ -3362,7 +3347,7 @@ export type GraphiteAutoEmbeddingsConfiguration_Insert_Input = {
createdAt?: InputMaybe<Scalars['timestamptz']>;
id?: InputMaybe<Scalars['uuid']>;
lastRun?: InputMaybe<Scalars['timestamptz']>;
model?: InputMaybe<Scalars['embedding_model_enum']>;
model?: InputMaybe<Scalars['String']>;
mutation?: InputMaybe<Scalars['String']>;
name?: InputMaybe<Scalars['String']>;
query?: InputMaybe<Scalars['String']>;
@@ -3378,7 +3363,7 @@ export type GraphiteAutoEmbeddingsConfiguration_Max_Fields = {
createdAt?: Maybe<Scalars['timestamptz']>;
id?: Maybe<Scalars['uuid']>;
lastRun?: Maybe<Scalars['timestamptz']>;
model?: Maybe<Scalars['embedding_model_enum']>;
model?: Maybe<Scalars['String']>;
mutation?: Maybe<Scalars['String']>;
name?: Maybe<Scalars['String']>;
query?: Maybe<Scalars['String']>;
@@ -3394,7 +3379,7 @@ export type GraphiteAutoEmbeddingsConfiguration_Min_Fields = {
createdAt?: Maybe<Scalars['timestamptz']>;
id?: Maybe<Scalars['uuid']>;
lastRun?: Maybe<Scalars['timestamptz']>;
model?: Maybe<Scalars['embedding_model_enum']>;
model?: Maybe<Scalars['String']>;
mutation?: Maybe<Scalars['String']>;
name?: Maybe<Scalars['String']>;
query?: Maybe<Scalars['String']>;
@@ -3471,7 +3456,7 @@ export type GraphiteAutoEmbeddingsConfiguration_Set_Input = {
createdAt?: InputMaybe<Scalars['timestamptz']>;
id?: InputMaybe<Scalars['uuid']>;
lastRun?: InputMaybe<Scalars['timestamptz']>;
model?: InputMaybe<Scalars['embedding_model_enum']>;
model?: InputMaybe<Scalars['String']>;
mutation?: InputMaybe<Scalars['String']>;
name?: InputMaybe<Scalars['String']>;
query?: InputMaybe<Scalars['String']>;
@@ -3494,7 +3479,7 @@ export type GraphiteAutoEmbeddingsConfiguration_Stream_Cursor_Value_Input = {
createdAt?: InputMaybe<Scalars['timestamptz']>;
id?: InputMaybe<Scalars['uuid']>;
lastRun?: InputMaybe<Scalars['timestamptz']>;
model?: InputMaybe<Scalars['embedding_model_enum']>;
model?: InputMaybe<Scalars['String']>;
mutation?: InputMaybe<Scalars['String']>;
name?: InputMaybe<Scalars['String']>;
query?: InputMaybe<Scalars['String']>;
@@ -3898,10 +3883,6 @@ export type Mutation_Root = {
deleteVirus?: Maybe<Virus>;
/** delete data from the table: "storage.virus" */
deleteViruses?: Maybe<Virus_Mutation_Response>;
/** delete data from the table: "todos" */
delete_todos?: Maybe<Todos_Mutation_Response>;
/** delete single row from the table: "todos" */
delete_todos_by_pk?: Maybe<Todos>;
graphite?: Maybe<GraphiteMutation>;
/** insert a single row into the table: "auth.providers" */
insertAuthProvider?: Maybe<AuthProviders>;
@@ -3955,10 +3936,6 @@ export type Mutation_Root = {
insertVirus?: Maybe<Virus>;
/** insert data into the table: "storage.virus" */
insertViruses?: Maybe<Virus_Mutation_Response>;
/** insert data into the table: "todos" */
insert_todos?: Maybe<Todos_Mutation_Response>;
/** insert a single row into the table: "todos" */
insert_todos_one?: Maybe<Todos>;
/** update single row of the table: "auth.providers" */
updateAuthProvider?: Maybe<AuthProviders>;
/** update single row of the table: "auth.provider_requests" */
@@ -4033,12 +4010,6 @@ export type Mutation_Root = {
update_buckets_many?: Maybe<Array<Maybe<Buckets_Mutation_Response>>>;
/** update multiples rows of table: "storage.files" */
update_files_many?: Maybe<Array<Maybe<Files_Mutation_Response>>>;
/** update data of the table: "todos" */
update_todos?: Maybe<Todos_Mutation_Response>;
/** update single row of the table: "todos" */
update_todos_by_pk?: Maybe<Todos>;
/** update multiples rows of table: "todos" */
update_todos_many?: Maybe<Array<Maybe<Todos_Mutation_Response>>>;
/** update multiples rows of table: "auth.users" */
update_users_many?: Maybe<Array<Maybe<Users_Mutation_Response>>>;
/** update multiples rows of table: "storage.virus" */
@@ -4304,18 +4275,6 @@ export type Mutation_RootDeleteVirusesArgs = {
};
/** mutation root */
export type Mutation_RootDelete_TodosArgs = {
where: Todos_Bool_Exp;
};
/** mutation root */
export type Mutation_RootDelete_Todos_By_PkArgs = {
id: Scalars['uuid'];
};
/** mutation root */
export type Mutation_RootInsertAuthProviderArgs = {
object: AuthProviders_Insert_Input;
@@ -4498,20 +4457,6 @@ export type Mutation_RootInsertVirusesArgs = {
};
/** mutation root */
export type Mutation_RootInsert_TodosArgs = {
objects: Array<Todos_Insert_Input>;
on_conflict?: InputMaybe<Todos_On_Conflict>;
};
/** mutation root */
export type Mutation_RootInsert_Todos_OneArgs = {
object: Todos_Insert_Input;
on_conflict?: InputMaybe<Todos_On_Conflict>;
};
/** mutation root */
export type Mutation_RootUpdateAuthProviderArgs = {
_set?: InputMaybe<AuthProviders_Set_Input>;
@@ -4816,26 +4761,6 @@ export type Mutation_RootUpdate_Files_ManyArgs = {
};
/** mutation root */
export type Mutation_RootUpdate_TodosArgs = {
_set?: InputMaybe<Todos_Set_Input>;
where: Todos_Bool_Exp;
};
/** mutation root */
export type Mutation_RootUpdate_Todos_By_PkArgs = {
_set?: InputMaybe<Todos_Set_Input>;
pk_columns: Todos_Pk_Columns_Input;
};
/** mutation root */
export type Mutation_RootUpdate_Todos_ManyArgs = {
updates: Array<Todos_Updates>;
};
/** mutation root */
export type Mutation_RootUpdate_Users_ManyArgs = {
updates: Array<Users_Updates>;
@@ -4944,12 +4869,6 @@ export type Query_Root = {
graphiteAutoEmbeddingsConfigurationAggregate: GraphiteAutoEmbeddingsConfiguration_Aggregate;
/** fetch data from the table: "graphite.auto_embeddings_configuration" */
graphiteAutoEmbeddingsConfigurations: Array<GraphiteAutoEmbeddingsConfiguration>;
/** fetch data from the table: "todos" */
todos: Array<Todos>;
/** fetch aggregated fields from the table: "todos" */
todos_aggregate: Todos_Aggregate;
/** fetch data from the table: "todos" using primary key columns */
todos_by_pk?: Maybe<Todos>;
/** fetch data from the table: "auth.users" using primary key columns */
user?: Maybe<Users>;
/** fetch data from the table: "auth.users" */
@@ -5264,29 +5183,6 @@ export type Query_RootGraphiteAutoEmbeddingsConfigurationsArgs = {
};
export type Query_RootTodosArgs = {
distinct_on?: InputMaybe<Array<Todos_Select_Column>>;
limit?: InputMaybe<Scalars['Int']>;
offset?: InputMaybe<Scalars['Int']>;
order_by?: InputMaybe<Array<Todos_Order_By>>;
where?: InputMaybe<Todos_Bool_Exp>;
};
export type Query_RootTodos_AggregateArgs = {
distinct_on?: InputMaybe<Array<Todos_Select_Column>>;
limit?: InputMaybe<Scalars['Int']>;
offset?: InputMaybe<Scalars['Int']>;
order_by?: InputMaybe<Array<Todos_Order_By>>;
where?: InputMaybe<Todos_Bool_Exp>;
};
export type Query_RootTodos_By_PkArgs = {
id: Scalars['uuid'];
};
export type Query_RootUserArgs = {
id: Scalars['uuid'];
};
@@ -5438,14 +5334,6 @@ export type Subscription_Root = {
graphiteAutoEmbeddingsConfigurationStream: Array<GraphiteAutoEmbeddingsConfiguration>;
/** fetch data from the table: "graphite.auto_embeddings_configuration" */
graphiteAutoEmbeddingsConfigurations: Array<GraphiteAutoEmbeddingsConfiguration>;
/** fetch data from the table: "todos" */
todos: Array<Todos>;
/** fetch aggregated fields from the table: "todos" */
todos_aggregate: Todos_Aggregate;
/** fetch data from the table: "todos" using primary key columns */
todos_by_pk?: Maybe<Todos>;
/** fetch data from the table in a streaming manner: "todos" */
todos_stream: Array<Todos>;
/** fetch data from the table: "auth.users" using primary key columns */
user?: Maybe<Users>;
/** fetch data from the table: "auth.users" */
@@ -5855,36 +5743,6 @@ export type Subscription_RootGraphiteAutoEmbeddingsConfigurationsArgs = {
};
export type Subscription_RootTodosArgs = {
distinct_on?: InputMaybe<Array<Todos_Select_Column>>;
limit?: InputMaybe<Scalars['Int']>;
offset?: InputMaybe<Scalars['Int']>;
order_by?: InputMaybe<Array<Todos_Order_By>>;
where?: InputMaybe<Todos_Bool_Exp>;
};
export type Subscription_RootTodos_AggregateArgs = {
distinct_on?: InputMaybe<Array<Todos_Select_Column>>;
limit?: InputMaybe<Scalars['Int']>;
offset?: InputMaybe<Scalars['Int']>;
order_by?: InputMaybe<Array<Todos_Order_By>>;
where?: InputMaybe<Todos_Bool_Exp>;
};
export type Subscription_RootTodos_By_PkArgs = {
id: Scalars['uuid'];
};
export type Subscription_RootTodos_StreamArgs = {
batch_size: Scalars['Int'];
cursor: Array<InputMaybe<Todos_Stream_Cursor_Input>>;
where?: InputMaybe<Todos_Bool_Exp>;
};
export type Subscription_RootUserArgs = {
id: Scalars['uuid'];
};
@@ -5944,19 +5802,6 @@ export type Subscription_RootVirusesAggregateArgs = {
where?: InputMaybe<Virus_Bool_Exp>;
};
/** Boolean expression to compare columns of type "timestamp". All fields are combined with logical 'AND'. */
export type Timestamp_Comparison_Exp = {
_eq?: InputMaybe<Scalars['timestamp']>;
_gt?: InputMaybe<Scalars['timestamp']>;
_gte?: InputMaybe<Scalars['timestamp']>;
_in?: InputMaybe<Array<Scalars['timestamp']>>;
_is_null?: InputMaybe<Scalars['Boolean']>;
_lt?: InputMaybe<Scalars['timestamp']>;
_lte?: InputMaybe<Scalars['timestamp']>;
_neq?: InputMaybe<Scalars['timestamp']>;
_nin?: InputMaybe<Array<Scalars['timestamp']>>;
};
/** Boolean expression to compare columns of type "timestamptz". All fields are combined with logical 'AND'. */
export type Timestamptz_Comparison_Exp = {
_eq?: InputMaybe<Scalars['timestamptz']>;
@@ -5970,208 +5815,6 @@ export type Timestamptz_Comparison_Exp = {
_nin?: InputMaybe<Array<Scalars['timestamptz']>>;
};
/** columns and relationships of "todos" */
export type Todos = {
__typename?: 'todos';
/** An object relationship */
attachment?: Maybe<Files>;
createdAt: Scalars['timestamp'];
done: Scalars['Boolean'];
file_id?: Maybe<Scalars['uuid']>;
id: Scalars['uuid'];
title: Scalars['String'];
updatedAt: Scalars['timestamptz'];
/** An object relationship */
user: Users;
user_id: Scalars['uuid'];
};
/** aggregated selection of "todos" */
export type Todos_Aggregate = {
__typename?: 'todos_aggregate';
aggregate?: Maybe<Todos_Aggregate_Fields>;
nodes: Array<Todos>;
};
/** aggregate fields of "todos" */
export type Todos_Aggregate_Fields = {
__typename?: 'todos_aggregate_fields';
count: Scalars['Int'];
max?: Maybe<Todos_Max_Fields>;
min?: Maybe<Todos_Min_Fields>;
};
/** aggregate fields of "todos" */
export type Todos_Aggregate_FieldsCountArgs = {
columns?: InputMaybe<Array<Todos_Select_Column>>;
distinct?: InputMaybe<Scalars['Boolean']>;
};
/** Boolean expression to filter rows from the table "todos". All fields are combined with a logical 'AND'. */
export type Todos_Bool_Exp = {
_and?: InputMaybe<Array<Todos_Bool_Exp>>;
_not?: InputMaybe<Todos_Bool_Exp>;
_or?: InputMaybe<Array<Todos_Bool_Exp>>;
attachment?: InputMaybe<Files_Bool_Exp>;
createdAt?: InputMaybe<Timestamp_Comparison_Exp>;
done?: InputMaybe<Boolean_Comparison_Exp>;
file_id?: InputMaybe<Uuid_Comparison_Exp>;
id?: InputMaybe<Uuid_Comparison_Exp>;
title?: InputMaybe<String_Comparison_Exp>;
updatedAt?: InputMaybe<Timestamptz_Comparison_Exp>;
user?: InputMaybe<Users_Bool_Exp>;
user_id?: InputMaybe<Uuid_Comparison_Exp>;
};
/** unique or primary key constraints on table "todos" */
export enum Todos_Constraint {
/** unique or primary key constraint on columns "id" */
TodosPkey = 'todos_pkey'
}
/** input type for inserting data into table "todos" */
export type Todos_Insert_Input = {
attachment?: InputMaybe<Files_Obj_Rel_Insert_Input>;
createdAt?: InputMaybe<Scalars['timestamp']>;
done?: InputMaybe<Scalars['Boolean']>;
file_id?: InputMaybe<Scalars['uuid']>;
id?: InputMaybe<Scalars['uuid']>;
title?: InputMaybe<Scalars['String']>;
updatedAt?: InputMaybe<Scalars['timestamptz']>;
user?: InputMaybe<Users_Obj_Rel_Insert_Input>;
user_id?: InputMaybe<Scalars['uuid']>;
};
/** aggregate max on columns */
export type Todos_Max_Fields = {
__typename?: 'todos_max_fields';
createdAt?: Maybe<Scalars['timestamp']>;
file_id?: Maybe<Scalars['uuid']>;
id?: Maybe<Scalars['uuid']>;
title?: Maybe<Scalars['String']>;
updatedAt?: Maybe<Scalars['timestamptz']>;
user_id?: Maybe<Scalars['uuid']>;
};
/** aggregate min on columns */
export type Todos_Min_Fields = {
__typename?: 'todos_min_fields';
createdAt?: Maybe<Scalars['timestamp']>;
file_id?: Maybe<Scalars['uuid']>;
id?: Maybe<Scalars['uuid']>;
title?: Maybe<Scalars['String']>;
updatedAt?: Maybe<Scalars['timestamptz']>;
user_id?: Maybe<Scalars['uuid']>;
};
/** response of any mutation on the table "todos" */
export type Todos_Mutation_Response = {
__typename?: 'todos_mutation_response';
/** number of rows affected by the mutation */
affected_rows: Scalars['Int'];
/** data from the rows affected by the mutation */
returning: Array<Todos>;
};
/** on_conflict condition type for table "todos" */
export type Todos_On_Conflict = {
constraint: Todos_Constraint;
update_columns?: Array<Todos_Update_Column>;
where?: InputMaybe<Todos_Bool_Exp>;
};
/** Ordering options when selecting data from "todos". */
export type Todos_Order_By = {
attachment?: InputMaybe<Files_Order_By>;
createdAt?: InputMaybe<Order_By>;
done?: InputMaybe<Order_By>;
file_id?: InputMaybe<Order_By>;
id?: InputMaybe<Order_By>;
title?: InputMaybe<Order_By>;
updatedAt?: InputMaybe<Order_By>;
user?: InputMaybe<Users_Order_By>;
user_id?: InputMaybe<Order_By>;
};
/** primary key columns input for table: todos */
export type Todos_Pk_Columns_Input = {
id: Scalars['uuid'];
};
/** select columns of table "todos" */
export enum Todos_Select_Column {
/** column name */
CreatedAt = 'createdAt',
/** column name */
Done = 'done',
/** column name */
FileId = 'file_id',
/** column name */
Id = 'id',
/** column name */
Title = 'title',
/** column name */
UpdatedAt = 'updatedAt',
/** column name */
UserId = 'user_id'
}
/** input type for updating data in table "todos" */
export type Todos_Set_Input = {
createdAt?: InputMaybe<Scalars['timestamp']>;
done?: InputMaybe<Scalars['Boolean']>;
file_id?: InputMaybe<Scalars['uuid']>;
id?: InputMaybe<Scalars['uuid']>;
title?: InputMaybe<Scalars['String']>;
updatedAt?: InputMaybe<Scalars['timestamptz']>;
user_id?: InputMaybe<Scalars['uuid']>;
};
/** Streaming cursor of the table "todos" */
export type Todos_Stream_Cursor_Input = {
/** Stream column input with initial value */
initial_value: Todos_Stream_Cursor_Value_Input;
/** cursor ordering */
ordering?: InputMaybe<Cursor_Ordering>;
};
/** Initial value of the column from where the streaming should start */
export type Todos_Stream_Cursor_Value_Input = {
createdAt?: InputMaybe<Scalars['timestamp']>;
done?: InputMaybe<Scalars['Boolean']>;
file_id?: InputMaybe<Scalars['uuid']>;
id?: InputMaybe<Scalars['uuid']>;
title?: InputMaybe<Scalars['String']>;
updatedAt?: InputMaybe<Scalars['timestamptz']>;
user_id?: InputMaybe<Scalars['uuid']>;
};
/** update columns of table "todos" */
export enum Todos_Update_Column {
/** column name */
CreatedAt = 'createdAt',
/** column name */
Done = 'done',
/** column name */
FileId = 'file_id',
/** column name */
Id = 'id',
/** column name */
Title = 'title',
/** column name */
UpdatedAt = 'updatedAt',
/** column name */
UserId = 'user_id'
}
export type Todos_Updates = {
/** sets the columns of the filtered rows to the given values */
_set?: InputMaybe<Todos_Set_Input>;
/** filter the rows which have to be updated */
where: Todos_Bool_Exp;
};
/** User account information. Don't modify its structure as Hasura Auth relies on it to function properly. */
export type Users = {
__typename?: 'users';
@@ -7150,11 +6793,11 @@ export type GetGraphiteAutoEmbeddingsConfigurationsQueryVariables = Exact<{
}>;
export type GetGraphiteAutoEmbeddingsConfigurationsQuery = { __typename?: 'query_root', graphiteAutoEmbeddingsConfigurations: Array<{ __typename?: 'graphiteAutoEmbeddingsConfiguration', id: any, name: string, model: any, schemaName: string, tableName: string, columnName: string, query?: string | null, mutation?: string | null, createdAt: any, updatedAt: any }>, graphiteAutoEmbeddingsConfigurationAggregate: { __typename?: 'graphiteAutoEmbeddingsConfiguration_aggregate', aggregate?: { __typename?: 'graphiteAutoEmbeddingsConfiguration_aggregate_fields', count: number } | null } };
export type GetGraphiteAutoEmbeddingsConfigurationsQuery = { __typename?: 'query_root', graphiteAutoEmbeddingsConfigurations: Array<{ __typename?: 'graphiteAutoEmbeddingsConfiguration', id: any, name: string, model: string, schemaName: string, tableName: string, columnName: string, query?: string | null, mutation?: string | null, createdAt: any, updatedAt: any }>, graphiteAutoEmbeddingsConfigurationAggregate: { __typename?: 'graphiteAutoEmbeddingsConfiguration_aggregate', aggregate?: { __typename?: 'graphiteAutoEmbeddingsConfiguration_aggregate_fields', count: number } | null } };
export type InsertGraphiteAutoEmbeddingsConfigurationMutationVariables = Exact<{
name?: InputMaybe<Scalars['String']>;
model?: InputMaybe<Scalars['embedding_model_enum']>;
model?: InputMaybe<Scalars['String']>;
schemaName?: InputMaybe<Scalars['String']>;
tableName?: InputMaybe<Scalars['String']>;
columnName?: InputMaybe<Scalars['String']>;
@@ -7168,7 +6811,7 @@ export type InsertGraphiteAutoEmbeddingsConfigurationMutation = { __typename?: '
export type UpdateGraphiteAutoEmbeddingsConfigurationMutationVariables = Exact<{
id: Scalars['uuid'];
name?: InputMaybe<Scalars['String']>;
model?: InputMaybe<Scalars['embedding_model_enum']>;
model?: InputMaybe<Scalars['String']>;
schemaName?: InputMaybe<Scalars['String']>;
tableName?: InputMaybe<Scalars['String']>;
columnName?: InputMaybe<Scalars['String']>;
@@ -7177,7 +6820,7 @@ export type UpdateGraphiteAutoEmbeddingsConfigurationMutationVariables = Exact<{
}>;
export type UpdateGraphiteAutoEmbeddingsConfigurationMutation = { __typename?: 'mutation_root', updateGraphiteAutoEmbeddingsConfiguration?: { __typename?: 'graphiteAutoEmbeddingsConfiguration', id: any, name: string, model: any, schemaName: string, tableName: string, columnName: string, query?: string | null, mutation?: string | null } | null };
export type UpdateGraphiteAutoEmbeddingsConfigurationMutation = { __typename?: 'mutation_root', updateGraphiteAutoEmbeddingsConfiguration?: { __typename?: 'graphiteAutoEmbeddingsConfiguration', id: any, name: string, model: string, schemaName: string, tableName: string, columnName: string, query?: string | null, mutation?: string | null } | null };
export type SendDevMessageMutationVariables = Exact<{
sessionId: Scalars['String'];
@@ -7489,7 +7132,7 @@ export function refetchGetGraphiteAutoEmbeddingsConfigurationsQuery(variables: G
return { query: GetGraphiteAutoEmbeddingsConfigurationsDocument, variables: variables }
}
export const InsertGraphiteAutoEmbeddingsConfigurationDocument = gql`
mutation insertGraphiteAutoEmbeddingsConfiguration($name: String, $model: embedding_model_enum, $schemaName: String, $tableName: String, $columnName: String, $query: String, $mutation: String) {
mutation insertGraphiteAutoEmbeddingsConfiguration($name: String, $model: String, $schemaName: String, $tableName: String, $columnName: String, $query: String, $mutation: String) {
insertGraphiteAutoEmbeddingsConfiguration(
object: {name: $name, model: $model, schemaName: $schemaName, tableName: $tableName, columnName: $columnName, query: $query, mutation: $mutation}
) {
@@ -7530,7 +7173,7 @@ export type InsertGraphiteAutoEmbeddingsConfigurationMutationHookResult = Return
export type InsertGraphiteAutoEmbeddingsConfigurationMutationResult = Apollo.MutationResult<InsertGraphiteAutoEmbeddingsConfigurationMutation>;
export type InsertGraphiteAutoEmbeddingsConfigurationMutationOptions = Apollo.BaseMutationOptions<InsertGraphiteAutoEmbeddingsConfigurationMutation, InsertGraphiteAutoEmbeddingsConfigurationMutationVariables>;
export const UpdateGraphiteAutoEmbeddingsConfigurationDocument = gql`
mutation updateGraphiteAutoEmbeddingsConfiguration($id: uuid!, $name: String, $model: embedding_model_enum, $schemaName: String, $tableName: String, $columnName: String, $query: String, $mutation: String) {
mutation updateGraphiteAutoEmbeddingsConfiguration($id: uuid!, $name: String, $model: String, $schemaName: String, $tableName: String, $columnName: String, $query: String, $mutation: String) {
updateGraphiteAutoEmbeddingsConfiguration(
pk_columns: {id: $id}
_set: {name: $name, model: $model, schemaName: $schemaName, tableName: $tableName, columnName: $columnName, query: $query, mutation: $mutation}

View File

@@ -22886,7 +22886,7 @@ export type GetSmtpSettingsQueryVariables = Exact<{
}>;
export type GetSmtpSettingsQuery = { __typename?: 'query_root', config?: { __typename: 'ConfigConfig', id: 'ConfigConfig', provider?: { __typename: 'ConfigProvider', id: 'ConfigProvider', smtp?: { __typename?: 'ConfigSmtp', host: string, method: string, port: any, secure: boolean, sender: string, user: string } | null } | null } | null };
export type GetSmtpSettingsQuery = { __typename?: 'query_root', config?: { __typename: 'ConfigConfig', id: 'ConfigConfig', provider?: { __typename: 'ConfigProvider', id: 'ConfigProvider', smtp?: { __typename?: 'ConfigSmtp', host: string, method: string, port: any, secure: boolean, sender: string, user: string, password: string } | null } | null } | null };
export type UpdateConfigMutationVariables = Exact<{
appId: Scalars['uuid'];
@@ -25353,6 +25353,7 @@ export const GetSmtpSettingsDocument = gql`
secure
sender
user
password
}
}
}

View File

@@ -87,3 +87,13 @@ export function getHasuraApiUrl() {
'https://local.hasura.nhost.run'
);
}
/**
* Custom URL of the config service.
*/
export function getConfigServerUrl() {
return (
process.env.NEXT_PUBLIC_NHOST_CONFIGSERVER_URL ||
'https://local.dashboard.nhost.run/v1/configserver/graphql'
);
}

View File

@@ -1,5 +1,12 @@
# @nhost/docs
## 2.10.1
### Patch Changes
- 9525fd7: fix: update AI docs for 0.5.0
- 076fd4a: fix: update permissions page to indicate we use jsonpath
## 2.10.0
### Minor Changes

View File

@@ -147,6 +147,7 @@ mutation {
insertGraphiteAutoEmbeddingsConfiguration(
object: {
name: "movies",
model: "text-embedding-3-small",
schemaName: "public",
tableName: "movies",
columnName: "embeddings",
@@ -184,3 +185,7 @@ The second thing that will happen is that the queries `graphiteSearchMovies`, `g
![auto-embeddings-search](/images/guides/ai/auto-embeddings/search.png)
![auto-embeddings-similar](/images/guides/ai/auto-embeddings/similar.png)
<Note>
Both queries accept a third argument `maxDistance`. This argument allows you to filter responses that are too far from the query, useful for ensuring that very specific queries do not return entirely unrelated responses. The argument is a float between `0.0` (an exact match) and 1.0 (completely unrelated), with a default setting of `1.0`, ensuring the best matches are always returned even if they are unrelated to the query.
</Note>

View File

@@ -7,7 +7,7 @@ icon: octagon-exclamation
**Permissions** or authorization rules are used to control acess to data and are set per role and table for each of the **select**, **insert**, **update**, and **delete** database operations.
Permissions follow a **Zero Trust** model, meaning that by default, no role, with the exception of **admin**, has any access. Access has to be explicitly granted.
Permissions follow a **Zero Trust** model, meaning that by default, no role, with the exception of **admin**, has any access. Access has to be explicitly granted.
![Permission Variables](/images/guides/graphql/dashboard-permissions.png)
@@ -39,13 +39,13 @@ query {
}
```
### Arrays
### JSONPath
You must add `[]` at the end of the path for permission variables that are arrays.
We leverage [JSONPath](https://goessner.net/articles/JsonPath/) to extract the data which means you have a good amount of flexibility. To help you build your queries you can leverage the following [playground](https://jsonpath.com). Just remember to skip `$.` when configuring them.
#### Example
#### Example
Let's say you have a permission variable `x-hasura-organization-ids`, the path should be, e.g., `user.profile.organizations.id[]`.
Let's say you have a permission variable `x-hasura-organization-ids`, the path should be, e.g., `user.profile.organizations[*].id`.
This will result in the following GraphQL query internally:
@@ -69,6 +69,10 @@ And result in the following permission variable:
}
```
<Note>
This example is very useful for those building multi-tenant applications.
</Note>
### Limitation on JSON/JSONB columns
JSON columns cannot be used in custom claims, except the `users.metadata` column.
@@ -77,7 +81,7 @@ JSON columns cannot be used in custom claims, except the `users.metadata` column
To use permission variables locally, add your claims to `nhost.toml` as follows:
#### Example
#### Example
Add a permission variable `x-hasura-organization-id`:
@@ -95,7 +99,7 @@ Every GraphQL request resolves permissions using a **single role**.
#### Default Role
Every user has one **default role**. The default role is used to resolve permissions if no role is specified using the `x-hasura-role` header in the GraphQL request.
Every user has one **default role**. The default role is used to resolve permissions if no role is specified using the `x-hasura-role` header in the GraphQL request.
`user` is the default role for authenticated users.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 931 KiB

After

Width:  |  Height:  |  Size: 984 KiB

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost/docs",
"version": "2.10.0",
"version": "2.10.1",
"private": true,
"scripts": {
"start": "mintlify dev"

View File

@@ -1,23 +1,23 @@
version: '3.6'
services:
traefik:
image: "traefik:v2.5"
container_name: "traefik"
image: 'traefik:v2.5'
container_name: 'traefik'
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:1337"
- "--entryPoints.admin.address=:3030"
- '--api.insecure=true'
- '--providers.docker=true'
- '--providers.docker.exposedbydefault=false'
- '--entrypoints.web.address=:1337'
- '--entryPoints.admin.address=:3030'
ports:
# hasura/services
- "1337:1337"
- '1337:1337'
# traefik interface
- "9090:8080"
- '9090:8080'
# dashboard
- "3030:3030"
- '3030:3030'
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- '/var/run/docker.sock:/var/run/docker.sock:ro'
postgres:
image: postgres
restart: always
@@ -43,16 +43,16 @@ services:
HASURA_GRAPHQL_LOG_LEVEL: debug
HASURA_GRAPHQL_ENABLE_CONSOLE: 'true'
healthcheck:
test:
- CMD-SHELL
- curl http://localhost:8080/healthz > /dev/null 2>&1
timeout: 60s
interval: 30s
start_period: 90s
test:
- CMD-SHELL
- curl http://localhost:8080/healthz > /dev/null 2>&1
timeout: 60s
interval: 30s
start_period: 90s
labels:
- "traefik.enable=true"
- "traefik.http.routers.hasura.rule=Host(`${PROXY_HOST}`, `localhost`) && PathPrefix(`/`)"
- "traefik.http.routers.hasura.entrypoints=web"
- 'traefik.enable=true'
- 'traefik.http.routers.hasura.rule=Host(`${PROXY_HOST}`, `localhost`) && PathPrefix(`/`)'
- 'traefik.http.routers.hasura.entrypoints=web'
auth:
image: nhost/hasura-auth:0.24
depends_on:
@@ -76,11 +76,11 @@ services:
expose:
- 4000
labels:
- "traefik.enable=true"
- "traefik.http.middlewares.strip-auth.stripprefix.prefixes=/v1/auth"
- "traefik.http.routers.auth.rule=Host(`${PROXY_HOST}`, `localhost`) && PathPrefix(`/v1/auth`)"
- "traefik.http.routers.auth.middlewares=strip-auth@docker"
- "traefik.http.routers.auth.entrypoints=web"
- 'traefik.enable=true'
- 'traefik.http.middlewares.strip-auth.stripprefix.prefixes=/v1/auth'
- 'traefik.http.routers.auth.rule=Host(`${PROXY_HOST}`, `localhost`) && PathPrefix(`/v1/auth`)'
- 'traefik.http.routers.auth.middlewares=strip-auth@docker'
- 'traefik.http.routers.auth.entrypoints=web'
storage:
image: nhost/hasura-storage:0.4.1
depends_on:
@@ -102,22 +102,22 @@ services:
POSTGRES_MIGRATIONS: 1
POSTGRES_MIGRATIONS_SOURCE: postgres://postgres:${POSTGRES_PASSWORD:-secretpgpassword}@postgres:5432/postgres?sslmode=disable
labels:
- "traefik.enable=true"
- "traefik.http.routers.storage.rule=Host(`${PROXY_HOST}`, `localhost`) && PathPrefix(`/v1/storage`)"
- "traefik.http.routers.storage.entrypoints=web"
- 'traefik.enable=true'
- 'traefik.http.routers.storage.rule=Host(`${PROXY_HOST}`, `localhost`) && PathPrefix(`/v1/storage`)'
- 'traefik.http.routers.storage.entrypoints=web'
# Rewrite the path so it matches with the new storage API path introduced in hasura-storage 0.2
- "traefik.http.middlewares.strip-suffix.replacepathregex.regex=^/v1/storage/(.*)"
- "traefik.http.middlewares.strip-suffix.replacepathregex.replacement=/v1/$$1"
- "traefik.http.routers.storage.middlewares=strip-suffix@docker"
- 'traefik.http.middlewares.strip-suffix.replacepathregex.regex=^/v1/storage/(.*)'
- 'traefik.http.middlewares.strip-suffix.replacepathregex.replacement=/v1/$$1'
- 'traefik.http.routers.storage.middlewares=strip-suffix@docker'
command: serve
functions:
image: nhost/functions:1.0.0
labels:
- "traefik.enable=true"
- "traefik.http.middlewares.strip-functions.stripprefix.prefixes=/v1/functions"
- "traefik.http.routers.functions.rule=Host(`${PROXY_HOST}`, `localhost`) && PathPrefix(`/v1/functions`)"
- "traefik.http.routers.functions.middlewares=strip-functions@docker"
- "traefik.http.routers.functions.entrypoints=web"
- 'traefik.enable=true'
- 'traefik.http.middlewares.strip-functions.stripprefix.prefixes=/v1/functions'
- 'traefik.http.routers.functions.rule=Host(`${PROXY_HOST}`, `localhost`) && PathPrefix(`/v1/functions`)'
- 'traefik.http.routers.functions.middlewares=strip-functions@docker'
- 'traefik.http.routers.functions.entrypoints=web'
restart: always
expose:
- 3000
@@ -144,7 +144,7 @@ services:
SMTP_PORT: ${AUTH_SMTP_PORT:-1025}
SMTP_PASS: ${AUTH_SMTP_PASS:-password}
SMTP_USER: ${AUTH_SMTP_USER:-user}
SMTP_SECURE: "${AUTH_SMTP_SECURE:-false}"
SMTP_SECURE: '${AUTH_SMTP_SECURE:-false}'
SMTP_SENDER: ${AUTH_SMTP_SENDER:-hbp@hbp.com}
ports:
- ${AUTH_SMTP_PORT:-1025}:1025
@@ -162,12 +162,13 @@ services:
NEXT_PUBLIC_NHOST_GRAPHQL_URL: ${NEXT_PUBLIC_NHOST_GRAPHQL_URL}
NEXT_PUBLIC_NHOST_STORAGE_URL: ${NEXT_PUBLIC_NHOST_STORAGE_URL}
NEXT_PUBLIC_NHOST_FUNCTIONS_URL: ${NEXT_PUBLIC_NHOST_FUNCTIONS_URL}
NEXT_PUBLIC_NHOST_CONFIGSERVER_URL: ${NEXT_PUBLIC_NHOST_CONFIGSERVER_URL}
expose:
- 3000
- 3000
labels:
- "traefik.enable=true"
- "traefik.http.routers.nhost.rule=Host(`${NHOST_HOST}`)"
- "traefik.http.routers.nhost.entrypoints=admin"
- 'traefik.enable=true'
- 'traefik.http.routers.nhost.rule=Host(`${NHOST_HOST}`)'
- 'traefik.http.routers.nhost.entrypoints=admin'
# If you would like to protect your dashboard with a username and password if it is publicly-facing, uncomment and fill in the following lines below according to the documentation at https://doc.traefik.io/traefik/middlewares/http/basicauth/
#- "traefik.http.routers.nhost.middlewares=auth"
#- "traefik.http.middlewares.auth.basicauth.users=