diff --git a/.env.example b/.env.example
index 4c3c8f2e9..d188894de 100644
--- a/.env.example
+++ b/.env.example
@@ -83,6 +83,8 @@ NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_MONTHLY_PRICE_ID=
NEXT_PUBLIC_POSTHOG_KEY=""
# OPTIONAL: Leave blank to disable billing.
NEXT_PUBLIC_FEATURE_BILLING_ENABLED=
+# OPTIONAL: Leave blank to allow users to signup through /signup page.
+NEXT_PUBLIC_DISABLE_SIGNUP=
# This is only required for the marketing site
# [[REDIS]]
diff --git a/apps/web/src/app/(unauthenticated)/signin/page.tsx b/apps/web/src/app/(unauthenticated)/signin/page.tsx
index a4890d849..0b0333b65 100644
--- a/apps/web/src/app/(unauthenticated)/signin/page.tsx
+++ b/apps/web/src/app/(unauthenticated)/signin/page.tsx
@@ -13,12 +13,14 @@ export default function SignInPage() {
-
- Don't have an account?{' '}
-
- Sign up
-
-
+ {process.env.NEXT_PUBLIC_DISABLE_SIGNUP !== 'true' && (
+
+ Don't have an account?{' '}
+
+ Sign up
+
+
+ )}
Create a new account
diff --git a/docker/compose.yml b/docker/compose.yml
index b427f419c..9d4f0e951 100644
--- a/docker/compose.yml
+++ b/docker/compose.yml
@@ -33,7 +33,6 @@ services:
- SMTP_MAIL_USER=username
- SMTP_MAIL_PASSWORD=password
- MAIL_FROM=admin@example.com
- - NEXT_PUBLIC_ALLOW_SIGNUP=true
ports:
- 3000:3000
volumes:
diff --git a/packages/lib/next-auth/auth-options.ts b/packages/lib/next-auth/auth-options.ts
index 6d59b0666..3b9492807 100644
--- a/packages/lib/next-auth/auth-options.ts
+++ b/packages/lib/next-auth/auth-options.ts
@@ -162,5 +162,17 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = {
return session;
},
+
+ async signIn({ user }) {
+ // We do this to stop OAuth providers from creating an account
+ // when signups are disabled
+ if (process.env.NEXT_PUBLIC_DISABLE_SIGNUP === 'true') {
+ const userData = await getUserByEmail({ email: user.email! });
+
+ return !!userData;
+ }
+
+ return true;
+ },
},
};
diff --git a/packages/trpc/server/auth-router/router.ts b/packages/trpc/server/auth-router/router.ts
index 59c51ade5..24dd272ee 100644
--- a/packages/trpc/server/auth-router/router.ts
+++ b/packages/trpc/server/auth-router/router.ts
@@ -11,6 +11,13 @@ import { ZSignUpMutationSchema, ZVerifyPasswordMutationSchema } from './schema';
export const authRouter = router({
signup: procedure.input(ZSignUpMutationSchema).mutation(async ({ input }) => {
try {
+ if (process.env.NEXT_PUBLIC_DISABLE_SIGNUP === 'true') {
+ throw new TRPCError({
+ code: 'BAD_REQUEST',
+ message: 'Signups are disabled.',
+ });
+ }
+
const { name, email, password, signature } = input;
const user = await createUser({ name, email, password, signature });
diff --git a/packages/tsconfig/process-env.d.ts b/packages/tsconfig/process-env.d.ts
index dda8f771b..badc05931 100644
--- a/packages/tsconfig/process-env.d.ts
+++ b/packages/tsconfig/process-env.d.ts
@@ -53,6 +53,8 @@ declare namespace NodeJS {
NEXT_PRIVATE_SMTP_FROM_NAME?: string;
NEXT_PRIVATE_SMTP_FROM_ADDRESS?: string;
+ NEXT_PUBLIC_DISABLE_SIGNUP?: string;
+
/**
* Vercel environment variables
*/
diff --git a/turbo.json b/turbo.json
index d96f681d8..3a96c2a07 100644
--- a/turbo.json
+++ b/turbo.json
@@ -42,6 +42,8 @@
"NEXT_PUBLIC_POSTHOG_KEY",
"NEXT_PUBLIC_FEATURE_BILLING_ENABLED",
"NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_MONTHLY_PRICE_ID",
+ "NEXT_PUBLIC_STRIPE_FREE_PLAN_ID",
+ "NEXT_PUBLIC_DISABLE_SIGNUP",
"NEXT_PRIVATE_DATABASE_URL",
"NEXT_PRIVATE_DIRECT_DATABASE_URL",
"NEXT_PRIVATE_GOOGLE_CLIENT_ID",