From c47a91715f5c77d09c3d43f60a2384fee714d470 Mon Sep 17 00:00:00 2001 From: Akhil Mohan Date: Mon, 15 Apr 2024 02:16:11 +0530 Subject: [PATCH 1/8] chore: rolling migration removed role and roleId field from project membership and identity project membership --- backend/.eslintrc.js | 5 +- ...520_drop-role-roleid-project-membership.ts | 47 +++++++++++++++++++ .../schemas/identity-project-memberships.ts | 2 - backend/src/db/schemas/project-memberships.ts | 4 +- backend/src/db/seeds/3-project.ts | 3 +- backend/src/db/seeds/4-machine-identity.ts | 3 +- .../ee/services/permission/permission-dal.ts | 19 ++------ .../routes/v1/project-membership-router.ts | 41 ++++++++-------- .../src/server/routes/v1/project-router.ts | 42 ++++++++--------- .../identity-project-service.ts | 4 +- backend/src/services/project/project-queue.ts | 3 +- .../src/services/project/project-service.ts | 10 ++-- 12 files changed, 99 insertions(+), 84 deletions(-) create mode 100644 backend/src/db/migrations/20240414192520_drop-role-roleid-project-membership.ts diff --git a/backend/.eslintrc.js b/backend/.eslintrc.js index 9c558919b..b23cf05ae 100644 --- a/backend/.eslintrc.js +++ b/backend/.eslintrc.js @@ -23,16 +23,17 @@ module.exports = { root: true, overrides: [ { - files: ["./e2e-test/**/*"], + files: ["./e2e-test/**/*", "./src/db/migrations/**/*"], rules: { "@typescript-eslint/no-unsafe-member-access": "off", "@typescript-eslint/no-unsafe-assignment": "off", "@typescript-eslint/no-unsafe-argument": "off", "@typescript-eslint/no-unsafe-return": "off", - "@typescript-eslint/no-unsafe-call": "off", + "@typescript-eslint/no-unsafe-call": "off" } } ], + rules: { "@typescript-eslint/no-empty-function": "off", "@typescript-eslint/no-unsafe-enum-comparison": "off", diff --git a/backend/src/db/migrations/20240414192520_drop-role-roleid-project-membership.ts b/backend/src/db/migrations/20240414192520_drop-role-roleid-project-membership.ts new file mode 100644 index 000000000..2dd58c5d1 --- /dev/null +++ b/backend/src/db/migrations/20240414192520_drop-role-roleid-project-membership.ts @@ -0,0 +1,47 @@ +import { Knex } from "knex"; + +import { ProjectMembershipRole, TableName } from "../schemas"; + +export async function up(knex: Knex): Promise { + const doesProjectRoleFieldExist = await knex.schema.hasColumn(TableName.ProjectMembership, "role"); + const doesProjectRoleIdFieldExist = await knex.schema.hasColumn(TableName.ProjectMembership, "roleId"); + await knex.schema.alterTable(TableName.ProjectMembership, (t) => { + if (doesProjectRoleFieldExist) t.dropColumn("roleId"); + if (doesProjectRoleIdFieldExist) t.dropColumn("role"); + }); + + const doesIdentityProjectRoleFieldExist = await knex.schema.hasColumn(TableName.IdentityProjectMembership, "role"); + const doesIdentityProjectRoleIdFieldExist = await knex.schema.hasColumn( + TableName.IdentityProjectMembership, + "roleId" + ); + await knex.schema.alterTable(TableName.IdentityProjectMembership, (t) => { + if (doesIdentityProjectRoleFieldExist) t.dropColumn("roleId"); + if (doesIdentityProjectRoleIdFieldExist) t.dropColumn("role"); + }); +} + +export async function down(knex: Knex): Promise { + const doesProjectRoleFieldExist = await knex.schema.hasColumn(TableName.ProjectMembership, "role"); + const doesProjectRoleIdFieldExist = await knex.schema.hasColumn(TableName.ProjectMembership, "roleId"); + await knex.schema.alterTable(TableName.ProjectMembership, (t) => { + if (!doesProjectRoleFieldExist) t.string("role").defaultTo(ProjectMembershipRole.Member); + if (!doesProjectRoleIdFieldExist) { + t.uuid("roleId"); + t.foreign("roleId").references("id").inTable(TableName.ProjectRoles); + } + }); + + const doesIdentityProjectRoleFieldExist = await knex.schema.hasColumn(TableName.IdentityProjectMembership, "role"); + const doesIdentityProjectRoleIdFieldExist = await knex.schema.hasColumn( + TableName.IdentityProjectMembership, + "roleId" + ); + await knex.schema.alterTable(TableName.IdentityProjectMembership, (t) => { + if (!doesIdentityProjectRoleFieldExist) t.string("role").defaultTo(ProjectMembershipRole.Member); + if (!doesIdentityProjectRoleIdFieldExist) { + t.uuid("roleId"); + t.foreign("roleId").references("id").inTable(TableName.ProjectRoles); + } + }); +} diff --git a/backend/src/db/schemas/identity-project-memberships.ts b/backend/src/db/schemas/identity-project-memberships.ts index 276c9581e..2f17c36d8 100644 --- a/backend/src/db/schemas/identity-project-memberships.ts +++ b/backend/src/db/schemas/identity-project-memberships.ts @@ -9,8 +9,6 @@ import { TImmutableDBKeys } from "./models"; export const IdentityProjectMembershipsSchema = z.object({ id: z.string().uuid(), - role: z.string(), - roleId: z.string().uuid().nullable().optional(), projectId: z.string(), identityId: z.string().uuid(), createdAt: z.date(), diff --git a/backend/src/db/schemas/project-memberships.ts b/backend/src/db/schemas/project-memberships.ts index 8576a318e..e522d6280 100644 --- a/backend/src/db/schemas/project-memberships.ts +++ b/backend/src/db/schemas/project-memberships.ts @@ -9,12 +9,10 @@ import { TImmutableDBKeys } from "./models"; export const ProjectMembershipsSchema = z.object({ id: z.string().uuid(), - role: z.string(), createdAt: z.date(), updatedAt: z.date(), userId: z.string().uuid(), - projectId: z.string(), - roleId: z.string().uuid().nullable().optional() + projectId: z.string() }); export type TProjectMemberships = z.infer; diff --git a/backend/src/db/seeds/3-project.ts b/backend/src/db/seeds/3-project.ts index d41efb71c..934130494 100644 --- a/backend/src/db/seeds/3-project.ts +++ b/backend/src/db/seeds/3-project.ts @@ -33,8 +33,7 @@ export async function seed(knex: Knex): Promise { const projectMembership = await knex(TableName.ProjectMembership) .insert({ projectId: project.id, - userId: seedData1.id, - role: ProjectMembershipRole.Admin + userId: seedData1.id }) .returning("*"); await knex(TableName.ProjectUserMembershipRole).insert({ diff --git a/backend/src/db/seeds/4-machine-identity.ts b/backend/src/db/seeds/4-machine-identity.ts index 618c47114..662232e02 100644 --- a/backend/src/db/seeds/4-machine-identity.ts +++ b/backend/src/db/seeds/4-machine-identity.ts @@ -78,8 +78,7 @@ export async function seed(knex: Knex): Promise { const identityProjectMembership = await knex(TableName.IdentityProjectMembership) .insert({ identityId: seedData1.machineIdentity.id, - projectId: seedData1.project.id, - role: ProjectMembershipRole.Admin + projectId: seedData1.project.id }) .returning("*"); diff --git a/backend/src/ee/services/permission/permission-dal.ts b/backend/src/ee/services/permission/permission-dal.ts index b89a3aa3d..d8114388e 100644 --- a/backend/src/ee/services/permission/permission-dal.ts +++ b/backend/src/ee/services/permission/permission-dal.ts @@ -72,7 +72,6 @@ export const permissionDALFactory = (db: TDbClient) => { .select(selectAllTableCols(TableName.GroupProjectMembershipRole)) .select( db.ref("id").withSchema(TableName.GroupProjectMembership).as("membershipId"), - // TODO(roll-forward-migration): remove this field when we drop this in next migration after a week db.ref("createdAt").withSchema(TableName.GroupProjectMembership).as("membershipCreatedAt"), db.ref("updatedAt").withSchema(TableName.GroupProjectMembership).as("membershipUpdatedAt"), db.ref("projectId").withSchema(TableName.GroupProjectMembership), @@ -105,7 +104,6 @@ export const permissionDALFactory = (db: TDbClient) => { .select(selectAllTableCols(TableName.ProjectUserMembershipRole)) .select( db.ref("id").withSchema(TableName.ProjectMembership).as("membershipId"), - // TODO(roll-forward-migration): remove this field when we drop this in next migration after a week db.ref("createdAt").withSchema(TableName.ProjectMembership).as("membershipCreatedAt"), db.ref("updatedAt").withSchema(TableName.ProjectMembership).as("membershipUpdatedAt"), db.ref("projectId").withSchema(TableName.ProjectMembership), @@ -131,11 +129,10 @@ export const permissionDALFactory = (db: TDbClient) => { const permission = sqlNestRelationships({ data: docs, key: "projectId", - parentMapper: ({ orgId, orgAuthEnforced, membershipId, membershipCreatedAt, membershipUpdatedAt, role }) => ({ + parentMapper: ({ orgId, orgAuthEnforced, membershipId, membershipCreatedAt, membershipUpdatedAt }) => ({ orgId, orgAuthEnforced, userId, - role, id: membershipId, projectId, createdAt: membershipCreatedAt, @@ -179,18 +176,10 @@ export const permissionDALFactory = (db: TDbClient) => { ? sqlNestRelationships({ data: groupDocs, key: "projectId", - parentMapper: ({ - orgId, - orgAuthEnforced, - membershipId, - membershipCreatedAt, - membershipUpdatedAt, - role - }) => ({ + parentMapper: ({ orgId, orgAuthEnforced, membershipId, membershipCreatedAt, membershipUpdatedAt }) => ({ orgId, orgAuthEnforced, userId, - role, id: membershipId, projectId, createdAt: membershipCreatedAt, @@ -270,7 +259,6 @@ export const permissionDALFactory = (db: TDbClient) => { .select( db.ref("id").withSchema(TableName.IdentityProjectMembership).as("membershipId"), db.ref("orgId").withSchema(TableName.Project).as("orgId"), // Now you can select orgId from Project - db.ref("role").withSchema(TableName.IdentityProjectMembership).as("oldRoleField"), db.ref("createdAt").withSchema(TableName.IdentityProjectMembership).as("membershipCreatedAt"), db.ref("updatedAt").withSchema(TableName.IdentityProjectMembership).as("membershipUpdatedAt"), db.ref("slug").withSchema(TableName.ProjectRoles).as("customRoleSlug"), @@ -299,11 +287,10 @@ export const permissionDALFactory = (db: TDbClient) => { const permission = sqlNestRelationships({ data: docs, key: "membershipId", - parentMapper: ({ membershipId, membershipCreatedAt, membershipUpdatedAt, oldRoleField, orgId }) => ({ + parentMapper: ({ membershipId, membershipCreatedAt, membershipUpdatedAt, orgId }) => ({ id: membershipId, identityId, projectId, - role: oldRoleField, createdAt: membershipCreatedAt, updatedAt: membershipUpdatedAt, orgId, diff --git a/backend/src/server/routes/v1/project-membership-router.ts b/backend/src/server/routes/v1/project-membership-router.ts index 2b281e6fe..d99b4ec08 100644 --- a/backend/src/server/routes/v1/project-membership-router.ts +++ b/backend/src/server/routes/v1/project-membership-router.ts @@ -35,31 +35,28 @@ export const registerProjectMembershipRouter = async (server: FastifyZodProvider }), response: { 200: z.object({ - memberships: ProjectMembershipsSchema.omit({ role: true }) - .merge( + memberships: ProjectMembershipsSchema.extend({ + user: UsersSchema.pick({ + email: true, + firstName: true, + lastName: true, + id: true + }).merge(UserEncryptionKeysSchema.pick({ publicKey: true })), + roles: z.array( z.object({ - user: UsersSchema.pick({ - email: true, - firstName: true, - lastName: true, - id: true - }).merge(UserEncryptionKeysSchema.pick({ publicKey: true })), - roles: z.array( - z.object({ - id: z.string(), - role: z.string(), - customRoleId: z.string().optional().nullable(), - customRoleName: z.string().optional().nullable(), - customRoleSlug: z.string().optional().nullable(), - isTemporary: z.boolean(), - temporaryMode: z.string().optional().nullable(), - temporaryRange: z.string().nullable().optional(), - temporaryAccessStartTime: z.date().nullable().optional(), - temporaryAccessEndTime: z.date().nullable().optional() - }) - ) + id: z.string(), + role: z.string(), + customRoleId: z.string().optional().nullable(), + customRoleName: z.string().optional().nullable(), + customRoleSlug: z.string().optional().nullable(), + isTemporary: z.boolean(), + temporaryMode: z.string().optional().nullable(), + temporaryRange: z.string().nullable().optional(), + temporaryAccessStartTime: z.date().nullable().optional(), + temporaryAccessEndTime: z.date().nullable().optional() }) ) + }) .omit({ createdAt: true, updatedAt: true }) .array() }) diff --git a/backend/src/server/routes/v1/project-router.ts b/backend/src/server/routes/v1/project-router.ts index d2306e9a2..2f05bb4be 100644 --- a/backend/src/server/routes/v1/project-router.ts +++ b/backend/src/server/routes/v1/project-router.ts @@ -70,32 +70,28 @@ export const registerProjectRouter = async (server: FastifyZodProvider) => { }), response: { 200: z.object({ - users: ProjectMembershipsSchema.omit({ role: true }) - .merge( + users: ProjectMembershipsSchema.extend({ + user: UsersSchema.pick({ + email: true, + firstName: true, + lastName: true, + id: true + }).merge(UserEncryptionKeysSchema.pick({ publicKey: true })), + roles: z.array( z.object({ - user: UsersSchema.pick({ - username: true, - email: true, - firstName: true, - lastName: true, - id: true - }).merge(UserEncryptionKeysSchema.pick({ publicKey: true })), - roles: z.array( - z.object({ - id: z.string(), - role: z.string(), - customRoleId: z.string().optional().nullable(), - customRoleName: z.string().optional().nullable(), - customRoleSlug: z.string().optional().nullable(), - isTemporary: z.boolean(), - temporaryMode: z.string().optional().nullable(), - temporaryRange: z.string().nullable().optional(), - temporaryAccessStartTime: z.date().nullable().optional(), - temporaryAccessEndTime: z.date().nullable().optional() - }) - ) + id: z.string(), + role: z.string(), + customRoleId: z.string().optional().nullable(), + customRoleName: z.string().optional().nullable(), + customRoleSlug: z.string().optional().nullable(), + isTemporary: z.boolean(), + temporaryMode: z.string().optional().nullable(), + temporaryRange: z.string().nullable().optional(), + temporaryAccessStartTime: z.date().nullable().optional(), + temporaryAccessEndTime: z.date().nullable().optional() }) ) + }) .omit({ createdAt: true, updatedAt: true }) .array() }) diff --git a/backend/src/services/identity-project/identity-project-service.ts b/backend/src/services/identity-project/identity-project-service.ts index 2da2492c0..18a1803ac 100644 --- a/backend/src/services/identity-project/identity-project-service.ts +++ b/backend/src/services/identity-project/identity-project-service.ts @@ -93,9 +93,7 @@ export const identityProjectServiceFactory = ({ const identityProjectMembership = await identityProjectDAL.create( { identityId, - projectId: project.id, - role: isCustomRole ? ProjectMembershipRole.Custom : role, - roleId: customRole?.id + projectId: project.id }, tx ); diff --git a/backend/src/services/project/project-queue.ts b/backend/src/services/project/project-queue.ts index 4431855ce..81ecd6da1 100644 --- a/backend/src/services/project/project-queue.ts +++ b/backend/src/services/project/project-queue.ts @@ -232,8 +232,7 @@ export const projectQueueFactory = ({ const projectMembership = await projectMembershipDAL.create( { projectId: project.id, - userId: ghostUser.user.id, - role: ProjectMembershipRole.Admin + userId: ghostUser.user.id }, tx ); diff --git a/backend/src/services/project/project-service.ts b/backend/src/services/project/project-service.ts index 9e8d70020..008dac593 100644 --- a/backend/src/services/project/project-service.ts +++ b/backend/src/services/project/project-service.ts @@ -141,8 +141,7 @@ export const projectServiceFactory = ({ const projectMembership = await projectMembershipDAL.create( { userId: ghostUser.user.id, - projectId: project.id, - role: ProjectMembershipRole.Admin + projectId: project.id }, tx ); @@ -244,8 +243,7 @@ export const projectServiceFactory = ({ const userProjectMembership = await projectMembershipDAL.create( { projectId: project.id, - userId: user.id, - role: projectAdmin.projectRole + userId: user.id }, tx ); @@ -302,9 +300,7 @@ export const projectServiceFactory = ({ const identityProjectMembership = await identityProjectDAL.create( { identityId: actorId, - projectId: project.id, - role: isCustomRole ? ProjectMembershipRole.Custom : ProjectMembershipRole.Admin, - roleId: customRole?.id + projectId: project.id }, tx ); From 97afc4ff514e546afc437989785e8c3dc65e56eb Mon Sep 17 00:00:00 2001 From: Akhil Mohan Date: Mon, 15 Apr 2024 02:23:36 +0530 Subject: [PATCH 2/8] feat: added back username field in response for project users --- backend/src/server/routes/v1/project-router.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/server/routes/v1/project-router.ts b/backend/src/server/routes/v1/project-router.ts index 2f05bb4be..280e52680 100644 --- a/backend/src/server/routes/v1/project-router.ts +++ b/backend/src/server/routes/v1/project-router.ts @@ -73,6 +73,7 @@ export const registerProjectRouter = async (server: FastifyZodProvider) => { users: ProjectMembershipsSchema.extend({ user: UsersSchema.pick({ email: true, + username: true, firstName: true, lastName: true, id: true From e2967f5e611d97707ad87e7e692ca0791aaa23cd Mon Sep 17 00:00:00 2001 From: Akhil Mohan Date: Mon, 15 Apr 2024 02:24:14 +0530 Subject: [PATCH 3/8] chore: added volume mount to migration docker dev image --- docker-compose.dev.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index f07aeb190..764761098 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -66,6 +66,8 @@ services: environment: - DB_CONNECTION_URI=postgres://infisical:infisical@db/infisical?sslmode=disable command: npm run migration:latest + volumes: + - ./backend/src:/app/src backend: container_name: infisical-dev-api From ba37b1c083b370efff0d535f88b71d7dfc84c58b Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Wed, 17 Apr 2024 00:55:37 -0400 Subject: [PATCH 4/8] on prem reference --- .../on-premise-architecture.png | Bin 0 -> 102818 bytes docs/mint.json | 3 +- .../reference-architectures/on-premise.mdx | 70 ++++++++++++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 docs/images/self-hosting/reference-architectures/on-premise-architecture.png create mode 100644 docs/self-hosting/reference-architectures/on-premise.mdx diff --git a/docs/images/self-hosting/reference-architectures/on-premise-architecture.png b/docs/images/self-hosting/reference-architectures/on-premise-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..a4d04f98d2adb3fc5c9ffbd618653e13e642b874 GIT binary patch literal 102818 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%0D(*vxS`0YBLF$IM0nlUV-X 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 eovhv5Z#w Date: Wed, 17 Apr 2024 01:16:47 -0400 Subject: [PATCH 5/8] remove old deployment options --- .../deployment-options/aws-ec2.mdx | 21 ---- .../deployment-options/aws-lightsail.mdx | 66 ----------- .../deployment-options/azure-app-services.mdx | 71 ------------ .../azure-container-instances.mdx | 88 -------------- .../digital-ocean-marketplace.mdx | 27 ----- .../deployment-options/fly.io.mdx | 108 ------------------ .../deployment-options/gcp-cloud-run.mdx | 67 ----------- .../deployment-options/railway.mdx | 61 ---------- .../deployment-options/render.mdx | 21 ---- 9 files changed, 530 deletions(-) delete mode 100644 docs/self-hosting/deployment-options/aws-ec2.mdx delete mode 100644 docs/self-hosting/deployment-options/aws-lightsail.mdx delete mode 100644 docs/self-hosting/deployment-options/azure-app-services.mdx delete mode 100644 docs/self-hosting/deployment-options/azure-container-instances.mdx delete mode 100644 docs/self-hosting/deployment-options/digital-ocean-marketplace.mdx delete mode 100644 docs/self-hosting/deployment-options/fly.io.mdx delete mode 100644 docs/self-hosting/deployment-options/gcp-cloud-run.mdx delete mode 100644 docs/self-hosting/deployment-options/railway.mdx delete mode 100644 docs/self-hosting/deployment-options/render.mdx diff --git a/docs/self-hosting/deployment-options/aws-ec2.mdx b/docs/self-hosting/deployment-options/aws-ec2.mdx deleted file mode 100644 index 303df2009..000000000 --- a/docs/self-hosting/deployment-options/aws-ec2.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: "AWS EC2" -description: "Learn to install Infisical on EC2 using Cloud Formation template" ---- - - -This deployment option will use AWS Cloudformation to auto deploy an instance of Infisical on a single EC2 via Docker Compose. - -**Resources that will be provisioned** -- 1 EC2 instance -- 1 DocumentDB cluster -- 1 DocumentDB instance -- Security groups - - -Once installation is complete, you will have to create the first account. No default account is provided. - - - - - \ No newline at end of file diff --git a/docs/self-hosting/deployment-options/aws-lightsail.mdx b/docs/self-hosting/deployment-options/aws-lightsail.mdx deleted file mode 100644 index b5cdb6c9d..000000000 --- a/docs/self-hosting/deployment-options/aws-lightsail.mdx +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: "AWS Lightsail" -description: "Deploy Infisical with AWS Lightsail" ---- - -Prerequisites: -- Have an account with [Amazon Web Services (AWS)](https://aws.amazon.com/) - - - - 1.1. In AWS, navigate to the **Lightsail** service and press **Create container service** under the **Containers** tab. - ![AWS Lightsail](/images/self-hosting/deployment-options/aws-lightsail/awsl-select-lightsail.png) - - ![AWS Lightsail create container service](/images/self-hosting/deployment-options/aws-lightsail/awsl-create-container-service.png) - - 1.2. In the **Container service location** section, select the AWS region that's closest to your infrastructure. - - Afterwards, in the **Container service capacity** section, set the power level and scale to fit your needs; you may opt for the default setting - and adjust accordingly in the future. - - ![AWS Lightsail container service capacity](/images/self-hosting/deployment-options/aws-lightsail/awsl-create-container-service-capacity.png) - - 1.3. In the **Set up your first deployment** section, select the **Specify a custom deployment** option. Give the container a friendly name like **infisical** and fill in your intended [Infisical public Docker image](https://hub.docker.com/r/infisical/infisical) in the **Image** field; this will pull the image from Docker Hub. - - For example, in order to opt for Infisical `v0.43.4`, you would input: `infisical/infisical:v0.43.4`. - - ![AWS Lightsail container service deployment](/images/self-hosting/deployment-options/aws-lightsail/awsl-create-container-service-deployment.png) - - 1.4. Running Infisical requires a few environment variables to be set for the container service. - At minimum, Infisical requires that you set the variables `ENCRYPTION_KEY`, `AUTH_SECRET`, `MONGO_URL`, and `REDIS_URL` - which you can read more about [here](/self-hosting/configuration/envars). - - In the **Environment variables** section, fill in the required environment variables. - - - To use more features like emailing and single sign-on, you can set additional configuration options [here](/self-hosting/configuration/envars). - - - Also, under the **Open ports** section, add an entry for port `8080` and protocol `HTTP` since Infisical listens on port `8080`. - - ![AWS Lightsail container service environment variables](/images/self-hosting/deployment-options/aws-lightsail/awsl-create-container-service-envars.png) - - 1.5. In the **Public endpoint** section, select the container from the previous steps from the dropdown; this will make the container accessible over the public internet. - - ![AWS Lightsail container service public endpoint](/images/self-hosting/deployment-options/aws-lightsail/awsl-create-container-service-public-endpoint.png) - - 1.6. Finally, in the **Identify your service** section, give the container service a unique name like infisical and press **Create container service**. - - ![AWS Lightsail container service summary](/images/self-hosting/deployment-options/aws-lightsail/awsl-create-container-service-summary.png) - - - On the newly-created container service page, wait for the **Status** to turn to **Running** and check out the **Public domain** of the container service; you can access your instance of Infisical by this URL. - - ![AWS Lightsail container service overview](/images/self-hosting/deployment-options/aws-lightsail/awsl-container-service-overview.png) - - - - - - Yes, here are a few that come to mind: - - In step 1.3, we recommend pinning the Docker image to a specific [version of Infisical](https://hub.docker.com/r/infisical/infisical/tags) - instead of referring to the `latest` tag to avoid any unexpected version-to-version migration issues. - - We're working on putting together a fuller list of deployment best practices as well as minimum resource configuration requirements for running Infisical so stay tuned! - - \ No newline at end of file diff --git a/docs/self-hosting/deployment-options/azure-app-services.mdx b/docs/self-hosting/deployment-options/azure-app-services.mdx deleted file mode 100644 index a8472ae2b..000000000 --- a/docs/self-hosting/deployment-options/azure-app-services.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: "Azure App Services" -description: "Deploy Infisical with Azure App Service" ---- - -Prerequisites: - - Have an account with [Microsoft Azure](https://azure.microsoft.com/en-us) - - - - 1.1. In Azure, navigate to the **App Services** solution and press **Create > Web App**. - - ![Azure app services](/images/self-hosting/deployment-options/azure-app-services/aas-select-app-services.png) - - ![Azure create app service](/images/self-hosting/deployment-options/azure-app-services/aas-create-app-service.png) - - 1.2. In the **Basics** section, specify the **Subscription** and **Resource group** to manage the deployed resource. - - Also, give the container a friendly name like Infisical and specify a **Region** for it to be deployed to. - - ![Azure app service basics](/images/self-hosting/deployment-options/azure-app-services/aas-create-app-service-basics.png) - - 1.3. In the **Docker** section, select the **Single Container** option under **Options** and specify **Docker Hub** as the image source - - Next, under the **Docker hub options** sub-section, select the **Public** option under **Access Type** and fill in your intended [Infisical public Docker image](https://hub.docker.com/r/infisical/infisical) in the **Image and tag** field; this will pull the image from Docker Hub. - - For example, in order to opt for Infisical `v0.43.4`, you would input: `infisical/infisical:v0.43.4`. - - ![Azure app service docker](/images/self-hosting/deployment-options/azure-app-services/aas-create-app-service-docker.png) - - 1.4. Finally, in the **Review + create** section, double check the information from the previous steps and press **Create** to create the Azure app service. - - ![Azure app service review](/images/self-hosting/deployment-options/azure-app-services/aas-create-app-service-review.png) - - 1.5. Next, wait a minute or two on the deployment overview page for the app to be created. Once the deployment is complete, press **Go to resource** - to head to the **App Service dashboard** for the newly-created app. - - ![Azure app service deployment complete](/images/self-hosting/deployment-options/azure-app-services/aas-app-service-deployment-complete.png) - - 1.6. Running Infisical requires a few environment variables to be set for the Azure app service. - At minimum, Infisical requires that you set the variables `ENCRYPTION_KEY`, `AUTH_SECRET`, `MONGO_URL`, and `REDIS_URL` - which you can read more about [here](/self-hosting/configuration/envars). - - - To use more features like emailing and single sign-on, you can set additional configuration options [here](/self-hosting/configuration/envars). - - - Additionally, you must set the variable `WEBSITES_PORT=8080` since - Infisical listens on port `8080`. - - In the **Settings > Configuration** section of the newly-created app service, fill in the required environment variables. - - ![Azure app service deployment complete](/images/self-hosting/deployment-options/azure-app-services/aas-app-service-configuration.png) - - - In the **Overview** section, check out the **Default domain** for your instance of Infisical; you can visit the instance at this URL. - - ![Azure app service deployment complete](/images/self-hosting/deployment-options/azure-app-services/aas-app-service-overview.png) - - - - - - Yes, here are a few that come to mind: - - In step 1.3, we recommend pinning the Docker image to a specific [version of Infisical](https://hub.docker.com/r/infisical/infisical/tags) - instead of referring to the `latest` tag to avoid any unexpected version-to-version migration issues. - - In step 1.2, we recommend selecting a **Region** option that is closest to your infrastructure/clients to reduce latency. - - We're working on putting together a fuller list of deployment best practices as well as minimum resource configuration requirements for running Infisical so stay tuned! - - \ No newline at end of file diff --git a/docs/self-hosting/deployment-options/azure-container-instances.mdx b/docs/self-hosting/deployment-options/azure-container-instances.mdx deleted file mode 100644 index 05e877f37..000000000 --- a/docs/self-hosting/deployment-options/azure-container-instances.mdx +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: "Azure Container Instances" -description: "Deploy Infisical with Azure Container Instances" ---- - -Prerequisites: -- Have an account with [Microsoft Azure](https://azure.microsoft.com/en-us) - - - This brief goes over how to deploy an instance of Infisical with Azure Container Instances without TLS/SSL configuration. - - There are various options for enabling TLS/SSL with Azure Container Instances more suitable for production including: - - [Enabling a TLS endpoint in a sidecar container](https://learn.microsoft.com/en-us/azure/container-instances/container-instances-container-group-ssl). - - [Enabling automatic HTTPS with Caddy in a sidecar container](https://learn.microsoft.com/en-us/azure/container-instances/container-instances-container-group-automatic-ssl). - - Using Azure Function Proxies, Application Gateway, etc. - - For a simpler deployment experience with complete TLS/SSL setup, you may try [deploying Infisical with Azure App Services](/self-hosting/deployment-options/azure-app-services). - - - - - 1.1. In Azure, navigate to the **Container Instances** solution and press **Create**. - - ![Azure container instance](/images/self-hosting/deployment-options/azure-container-instances/aci-select-container-instances.png) - - ![Azure create container instance](/images/self-hosting/deployment-options/azure-container-instances/aci-create-container-instance.png) - - 1.2. In the **Basics** section, specify the **Subscription** and **Resource group** to manage the deployed resource. - - Also, give the container a friendly name like Infisical and specify a **Region** for it to be deployed to. - - ![Azure container instance basics](/images/self-hosting/deployment-options/azure-container-instances/aci-create-container-instance-basics-1.png) - - Next, select the **Public** option under **Image type** and fill in your intended [Infisical public Docker image](https://hub.docker.com/r/infisical/infisical) in the **Image** field; this will pull the image from Docker Hub. - - For example, in order to opt for Infisical `v0.43.4`, you would input: `infisical/infisical:v0.43.4`. - - ![Azure container instance basics](/images/self-hosting/deployment-options/azure-container-instances/aci-create-container-instance-basics-2.png) - - - Depending on your use-case and requirements, you may find it helpful to further configure your Azure container instance. - - For example, you may want to adjust the **Region** option to specify which region to deploy the container for your - instance of Infisical to minimize distance and therefore latency between the instance and your infrastructure. - - - 1.3. In the **Networking** section, select the **Public** option under **Networking type**; this will make the container accessible over the public internet. - - Next, under the **Ports** section, add an entry for port `8080` and protocol `TCP` since Infisical listens on port `8080`. - - ![Azure container instance networking](/images/self-hosting/deployment-options/azure-container-instances/aci-create-container-instance-networking.png) - - 1.4. Running Infisical requires a few environment variables to be set for the Azure container instance. - At minimum, Infisical requires that you set the variables `ENCRYPTION_KEY`, `AUTH_SECRET`, `MONGO_URL`, and `REDIS_URL` - which you can read more about [here](/self-hosting/configuration/envars). - - In the **Advanced** section, fill in the required environment variables. - - - To use more features like emailing and single sign-on, you can set additional configuration options [here](/self-hosting/configuration/envars). - - - ![Azure container instance advanced](/images/self-hosting/deployment-options/azure-container-instances/aci-create-container-instance-advanced.png) - - 1.5. Finally, in the **Review + create** section, double check the information from the previous steps and press **Create** to create the Azure container instance. - - ![Azure container instance review](/images/self-hosting/deployment-options/azure-container-instances/aci-create-container-instance-review.png) - - - Head to the **Overview** page of the newly-created container instance to view its **IP address (Public)**; you can access your instance of Infisical by this IP address under the port `:8080`. - - For example, in the image below, the IP address of the sample deployed container instance is `4.255.87.109`; the instance would be accessible in the browser by heading to `4.255.87.109:8080`. - - ![Azure container instance overview](/images/self-hosting/deployment-options/azure-container-instances/aci-container-instance-overview.png) - - - - - - Yes, here are a few that come to mind: - - In step 1.2, we recommend pinning the Docker image to a specific [version of Infisical](https://hub.docker.com/r/infisical/infisical/tags) - instead of referring to the `latest` tag to avoid any unexpected version-to-version migration issues. - - In step 1.2, we recommend selecting a **Region** option that is closest to your infrastructure/clients to reduce latency. - - Enable TLS/SSL with Azure Container Instances. There are various options for doing so including [enabling a TLS endpoint in a sidecar container](https://learn.microsoft.com/en-us/azure/container-instances/container-instances-container-group-ssl), [enabling automatic HTTPS with Caddy in a sidecar container](https://learn.microsoft.com/en-us/azure/container-instances/container-instances-container-group-automatic-ssl), and using Azure Function Proxies, Application Gateway, etc. - - We're working on putting together a fuller list of deployment best practices as well as minimum resource configuration requirements for running Infisical so stay tuned! - - \ No newline at end of file diff --git a/docs/self-hosting/deployment-options/digital-ocean-marketplace.mdx b/docs/self-hosting/deployment-options/digital-ocean-marketplace.mdx deleted file mode 100644 index f1e739f08..000000000 --- a/docs/self-hosting/deployment-options/digital-ocean-marketplace.mdx +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: "Digital Ocean" -description: "Learn to install Infisical on Digital Ocean" ---- - -Infisical can be deployed on a Kubernetes cluster with a single click through our Digital Ocean marketplace application. -The initiation of the installation process triggers the creation of a Kubernetes cluster, followed by the installation of Infisical onto that cluster. - -This automated deployment method uses the same process under the hood as the manual [Kubernetes installation guide](./kubernetes-helm). - -### Initiate the installation - -To start the process, click the following button and follow the instructions there. - - - - - -### Access Infisical Web -Once the installation finishes, head to the `Networking` section via the sidebar and select `Load Balancers`. -Within this section, you'll find the newly created load balancer for Infisical. You can access Infisical at the IP address allocated to that load balancer. - -### Adjusting configurations -If you need to either upgrade or downgrade Infisical, or modify environment variables to alter its functionality, refer to our [Kubernetes installation](./kubernetes-helm) page for detailed instructions. - -Because Digital Ocean deploys the same Helm application as described in our [Kubernetes installation](./kubernetes-helm) guide, you can utilize that guide to implement the required changes. -It's important to note that any modifications requires familiarly with Helm package manager. diff --git a/docs/self-hosting/deployment-options/fly.io.mdx b/docs/self-hosting/deployment-options/fly.io.mdx deleted file mode 100644 index dacd9476b..000000000 --- a/docs/self-hosting/deployment-options/fly.io.mdx +++ /dev/null @@ -1,108 +0,0 @@ ---- -title: "Fly.io" -description: "Deploy Infisical with Fly.io" ---- - -Prerequisites: -- Have an account with [Fly.io](https://fly.io/) -- Have installed the [Fly.io CLI](https://fly.io/docs/hands-on/install-flyctl/) - - - - In your terminal, run the following command from the source directory of your project to create a new Fly.io app - with a `fly.toml` configuration file: - - ``` - fly launch - ``` - - - Add a **build** section to the `fly.toml` file to specify the [Infisical public Docker image](https://hub.docker.com/r/infisical/infisical): - - ``` - [build] - image = "infisical/infisical:v0.43.4" - ``` - - Afterwards, your `fly.toml` file should look similar to: - - ``` - app = "infisical" - primary_region = "lax" - - [http_service] - internal_port = 8080 - force_https = true - auto_stop_machines = true - auto_start_machines = true - min_machines_running = 0 - processes = ["app"] - - [[vm]] - cpu_kind = "shared" - cpus = 1 - memory_mb = 1024 - - [build] - image = "infisical/infisical:v0.43.4" - ``` - - - Depending on your use-case and requirements, you may find it helpful to further configure your `fly.toml` file - with options [here](https://fly.io/docs/reference/configuration/). - - For example, you may want to adjust the `primary-region` option to specify which [region](https://fly.io/docs/reference/regions/) to create the new machine for your - instance of Infisical to minimize distance and therefore latency between the instance and your infrastructure. - - - - - Running Infisical requires a few environment variables to be set on the Fly.io machine. - At minimum, Infisical requires that you set the variables `ENCRYPTION_KEY`, `AUTH_SECRET`, `MONGO_URL`, and `REDIS_URL` - which you can read more about [here](/self-hosting/configuration/envars). - - For this step, we recommend setting the variables as Fly.io [app secrets](https://fly.io/docs/reference/secrets/) which - are made available to the app as environment variables. You can set the variables either via the Fly.io CLI or project [dashboard](https://fly.io/dashboard). - - - - Run the following command (with each `VALUE` replaced) in the source directory of your project to set the required variables: - - ``` - flyctl secrets set ENCRYPTION_KEY=VALUE AUTH_SECRET=VALUE MONGO_URL=VALUE REDIS_URL=VALUE... - ``` - - - In Fly.io, head to your Project > Secrets and add the required variables. - - ![Fly.io deployment secrets](/images/self-hosting/deployment-options/flyio/flyio-secrets.png) - - - - - To use more features like emailing and single sign-on, you can set additional configuration options [here](/self-hosting/configuration/envars). - - - - Finally, run the following command in the source directory of your project to deploy your Infisical instance on Fly.io - with the updated `fly.toml` configuration file from step 2 and secrets from step 3: - - ``` - fly deploy - ``` - - - - - - Yes, here are a few that come to mind: - - In step 2, we recommend pinning the Docker image to a specific [version of Infisical](https://hub.docker.com/r/infisical/infisical/tags) - instead of referring to the `latest` tag to avoid any unexpected version-to-version migration issues. - - In step 2, we recommend selecting a `primary_region` option that is closest to your infrastructure/clients to reduce latency; a full list of regions supported by Fly.io can be found [here](https://fly.io/docs/reference/regions/). - - We're working on putting together a fuller list of deployment best practices as well as minimum resource configuration requirements for running Infisical so stay tuned! - - - -Resources: -- [Fly.io documentation](https://fly.io/docs/) \ No newline at end of file diff --git a/docs/self-hosting/deployment-options/gcp-cloud-run.mdx b/docs/self-hosting/deployment-options/gcp-cloud-run.mdx deleted file mode 100644 index 67c9fcf57..000000000 --- a/docs/self-hosting/deployment-options/gcp-cloud-run.mdx +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: "GCP Cloud Run" -description: "Deploy Infisical with GCP Cloud Run" ---- - -Prerequisites: -- Have an account with [Google Cloud Platform (GCP)](https://cloud.google.com/) - - - - In GCP, create a new project and give it a friendly name like Infisical. - - ![GCP create project](/images/self-hosting/deployment-options/gcp-cloud-run/gcp-cloud-run-create-project.png) - - ![GCP create project](/images/self-hosting/deployment-options/gcp-cloud-run/gcp-cloud-run-create-project-2.png) - - - 2.1. Inside the GCP project, navigate to the **Cloud Run** product and create a new service. - - ![GCP Cloud Run](/images/self-hosting/deployment-options/gcp-cloud-run/gcp-cloud-run-select-cloud-run.png) - - ![GCP Cloud Run create service](/images/self-hosting/deployment-options/gcp-cloud-run/gcp-cloud-run-create-service.png) - - 2.2. In the service creation form, select the **Deploy one revision from an existing container image** option and fill in your intended [Infisical public Docker image](https://hub.docker.com/r/infisical/infisical) in the container image URL. - - For example, in order to opt for Infisical `v0.43.4`, you would input: `docker.io/infisical/infisical:v0.43.4`. - - ![GCP Cloud Run create service docker image specification](/images/self-hosting/deployment-options/gcp-cloud-run/gcp-cloud-run-create-service-docker-image.png) - - 2.3. Running Infisical requires a few environment variables to be set for the GCP Cloud Run service. - At minimum, Infisical requires that you set the variables `ENCRYPTION_KEY`, `AUTH_SECRET`, `MONGO_URL`, and `REDIS_URL` - which you can read more about [here](/self-hosting/configuration/envars). - - For this step, fill in the required environment variables in the Edit Container > Variables & Secrets > Environment variables section. - - - To use more features like emailing and single sign-on, you can set additional configuration options [here](/self-hosting/configuration/envars). - - - ![GCP Cloud Run create service environment variable specification](/images/self-hosting/deployment-options/gcp-cloud-run/gcp-cloud-run-create-service-envars.png) - - - Depending on your use-case and requirements, you may find it helpful to further configure your GCP Cloud Run service. - - For example, you may want to adjust the **Region** option to specify which region to deploy the underlying container for your - instance of Infisical to minimize distance and therefore latency between the instance and your infrastructure. - - - Finally, press **Create** to finish setting up the GCP Cloud Run service. - - - Head to the **Service details** of the newly-created service to view its URL; you can access your instance of Infisical by clicking on the URL. - - ![GCP Cloud Run service details](/images/self-hosting/deployment-options/gcp-cloud-run/gcp-cloud-run-service-details.png) - - - - - - Yes, here are a few that come to mind: - - In step 2, we recommend pinning the Docker image to a specific [version of Infisical](https://hub.docker.com/r/infisical/infisical/tags) - instead of referring to the `latest` tag to avoid any unexpected version-to-version migration issues. - - In step 2, we recommend selecting a **Region** option that is closest to your infrastructure/clients to reduce latency. - - We're working on putting together a fuller list of deployment best practices as well as minimum resource configuration requirements for running Infisical so stay tuned! - - \ No newline at end of file diff --git a/docs/self-hosting/deployment-options/railway.mdx b/docs/self-hosting/deployment-options/railway.mdx deleted file mode 100644 index 29d2ce293..000000000 --- a/docs/self-hosting/deployment-options/railway.mdx +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: "Railway" -description: "Deploy Infisical with Railway" ---- - -Prerequisites: -- Have an account with [Railway](https://railway.app/) - - - - 1.1. In Railway, create a new project and select **Deploy a template > Infisical**. - - ![Railway create project](/images/self-hosting/deployment-options/railway/railway-create-project.png) - - ![Railway deploy template](/images/self-hosting/deployment-options/railway/railway-deploy-template.png) - - ![Railway deploy template infisical](/images/self-hosting/deployment-options/railway/railway-deploy-template-infisical.png) - - ![Railway template overview](/images/self-hosting/deployment-options/railway/railway-template-overview.png) - - 1.2. At minimum, Infisical requires that you set the variables `ENCRYPTION_KEY`, `AUTH_SECRET`, `MONGO_URL`, and `REDIS_URL` - which you can read more about [here](/self-hosting/configuration/envars). - - By default, the Infisical template on Railway pre-configures environment variables on each service in the deployment but requires you to supply two for the Redis and MongoDB services. - - On the MongoDB service, supply a value for the `MONGO_INITDB_ROOT_PASSWORD` variable. - - ![Railway template MongoDB configuration](/images/self-hosting/deployment-options/railway/railway-template-mongodb.png) - - On the Redis service, supply a value for the `REDIS_PASSWORD` variable. - - ![Railway template Redis configuration](/images/self-hosting/deployment-options/railway/railway-template-redis.png) - - ![Railway template Redis configuration](/images/self-hosting/deployment-options/railway/railway-template-redis.png) - - - To use more features like emailing and single sign-on, you can set additional configuration options on the Infisical service [here](/self-hosting/configuration/envars). - - - Finally, press **Deploy** to create the project and deploy the services within it. - - ![Railway template Infisical configuration](/images/self-hosting/deployment-options/railway/railway-template-infisical.png) - - ![Railway Infisical architecture](/images/self-hosting/deployment-options/railway/railway-infisical-architecture.png) - - - Head to the newly-created Infisical service to view its URL under Networking > Public Networking; you can access your instance of Infisical by clicking on the URL. - - ![Railway Infisical service](/images/self-hosting/deployment-options/railway/railway-infisical-service.png) - - - - - - Yes, here are a few that come to mind: - - While the Infisical template on Railway uses the `latest` tag to get the latest version of Infisical, we recommend creating a Railway deployment that pins the Docker image to a specific [version of Infisical](https://hub.docker.com/r/infisical/infisical/tags) to avoid any unexpected version-to-version migration issues. - - We recommend selecting **Deployment region** options for your Railway service deployments to be closest to your infrastructure/clients to reduce latency. - - We're working on putting together a fuller list of deployment best practices as well as minimum resource configuration requirements for running Infisical so stay tuned! - - \ No newline at end of file diff --git a/docs/self-hosting/deployment-options/render.mdx b/docs/self-hosting/deployment-options/render.mdx deleted file mode 100644 index 17faf060a..000000000 --- a/docs/self-hosting/deployment-options/render.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: "Render.com" -description: "Learn to install Infisical Render.com" ---- - -**Prerequisites** -- An account at Render.com -- A document DB instance - -Deploying on Render is one of the quickest ways to have Infisical running in production. -Before you start deployment, you will need to obtain document db connection string. This will be used for `MONGO_URL` environment variable required during installation. - -You can create a document db database using services such as [MongoDB](https://www.mongodb.com/), [AWS DocumentDB](https://aws.amazon.com/documentdb/), and others. Once done, click the link below to start deployment. - -### **[Deploy to Render](https://render.com/deploy?repo=https://github.com/Infisical/infisical)** - -# - - -Once installation is complete, you will have to create the first account. No default account is provided. - \ No newline at end of file From be63e538d7d6e6a2ee92abfe942d9033adfd3951 Mon Sep 17 00:00:00 2001 From: vmatsiiako <78047717+vmatsiiako@users.noreply.github.com> Date: Wed, 17 Apr 2024 08:11:49 -0600 Subject: [PATCH 6/8] Update email-password.mdx --- docs/documentation/platform/auth-methods/email-password.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/documentation/platform/auth-methods/email-password.mdx b/docs/documentation/platform/auth-methods/email-password.mdx index 82eae1642..54c95fb65 100644 --- a/docs/documentation/platform/auth-methods/email-password.mdx +++ b/docs/documentation/platform/auth-methods/email-password.mdx @@ -1,5 +1,5 @@ --- -title: "Email and Pasword" +title: "Email and Password" description: "Learn how to authenticate into Infisical with email and password." --- @@ -9,6 +9,6 @@ It is currently possible to use the **Email and Password** auth method to authen Every **Email and Password** is accompanied by an emergency kit given to users during signup. If the password is lost or forgotten, emergency kit is only way to retrieve the access to your account. It is possible to generate a new emergency kit with the following steps: 1. Open the `Personal Settings` menu. -![open personal settings](../../images/auth-methods/access-personal-settings.png) +![open personal settings](/images/auth-methods/access-personal-settings.png) 2. Scroll down to the `Emergency Kit` section. -3. Enter your current password and click `Save`. \ No newline at end of file +3. Enter your current password and click `Save`. From 94fa294455126a392371701c90f471c8fbe81548 Mon Sep 17 00:00:00 2001 From: vmatsiiako <78047717+vmatsiiako@users.noreply.github.com> Date: Wed, 17 Apr 2024 08:13:05 -0600 Subject: [PATCH 7/8] Update email-password.mdx --- docs/documentation/platform/auth-methods/email-password.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/documentation/platform/auth-methods/email-password.mdx b/docs/documentation/platform/auth-methods/email-password.mdx index 54c95fb65..db23026b8 100644 --- a/docs/documentation/platform/auth-methods/email-password.mdx +++ b/docs/documentation/platform/auth-methods/email-password.mdx @@ -9,6 +9,6 @@ It is currently possible to use the **Email and Password** auth method to authen Every **Email and Password** is accompanied by an emergency kit given to users during signup. If the password is lost or forgotten, emergency kit is only way to retrieve the access to your account. It is possible to generate a new emergency kit with the following steps: 1. Open the `Personal Settings` menu. -![open personal settings](/images/auth-methods/access-personal-settings.png) +![open personal settings](../../../images/auth-methods/access-personal-settings.png) 2. Scroll down to the `Emergency Kit` section. 3. Enter your current password and click `Save`. From e6823c520ea9783ea2232209e5cc62b74122996f Mon Sep 17 00:00:00 2001 From: Vladyslav Matsiiako Date: Wed, 17 Apr 2024 12:50:14 -0600 Subject: [PATCH 8/8] fixed import icon in the overview dashboard --- frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx b/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx index 03e4f50f6..692bdcbe3 100644 --- a/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx +++ b/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx @@ -138,6 +138,7 @@ export const SecretOverviewPage = () => { const { isImportedSecretPresentInEnv } = useGetImportedSecretsAllEnvs({ projectId: workspaceId, decryptFileKey: latestFileKey!, + path: secretPath, environments: userAvailableEnvs.map(({ slug }) => slug) }); @@ -340,6 +341,8 @@ export const SecretOverviewPage = () => { ); const canViewOverviewPage = Boolean(userAvailableEnvs.length); + // This is needed to also show imports from other paths – right now those are missing. + // const combinedKeys = [...secKeys, ...secretImports.map((impSecrets) => impSecrets?.data?.map((impSec) => impSec.secrets?.map((impSecKey) => impSecKey.key))).flat().flat()]; const filteredSecretNames = secKeys ?.filter((name) => name.toUpperCase().includes(searchFilter.toUpperCase())) .sort((a, b) => (sortDir === "asc" ? a.localeCompare(b) : b.localeCompare(a)));