Next.js Discord

Discord Forum

Next, Docker, Plesk and I have no idea what the error could be.

Unanswered
MeKa posted this in #help-forum
Open in Discord
The project runs on "localhost" without any problems. There is no error when I run "npm run build", but when I build "docker build ./ -t mekavip:1.0.7" with docker, this error appears.

The problem is that the project works very well, but when I build it with Docker and publish it to Plesk, some "URL" addresses give an "Internal Server Error" error. The URL addresses that give this error are the "/login", "/register" pages and the "/panel" url address linked to "next-auth", but when the "panel" url address does not have login permission, it automatically redirects to the "/login" url page.

  => => # Learn more: https://nextjs.org/docs/api-reference/edge-runtime
  => => # Import trace for requested module:
  => => # ./node_modules/bcryptjs/dist/bcrypt.js
  => => # ./lib/auth.config.ts
  => => # ./lib/auth.ts
  => => # Linting and checking validity of types ...

23 Replies

/lib/auth.ts

import NextAuth from "next-auth";
import { PrismaAdapter } from "@auth/prisma-adapter";
import prisma from "prismadb";
import authConfig from "auth.config";

export const { handlers, auth, signIn, signOut } = NextAuth({
  basePath: "/api/auth",
  secret: process.env.AUTH_SECRET,
  debug: process.env.NODE_ENV !== "production",
  adapter: PrismaAdapter(prisma),
  trustHost: true,
  ...authConfig,
});
/lib/auth.config.ts

import type { NextAuthConfig } from "next-auth";
import GoogleProvider from "next-auth/providers/google";
import CredentialsProvider from "next-auth/providers/credentials";
import { compare } from "bcryptjs";
import prisma from "prismadb";

export default {
  providers: [
    CredentialsProvider({
      id: "credentials",
      name: "Credentials",
      credentials: {
        email: { label: "Email", type: "text" },
        password: { label: "Password", type: "password" },
      },
      async authorize(credentials) {
        if (!credentials?.email || !credentials?.password) {
          throw new Error("Something went wrong.");
        }

        try {
          const user = await prisma.user.findUnique({
            where: {
              email: credentials.email as string,
            },
          });
          const isPasswordCorrect = await compare(
            credentials?.password as string,
            user?.password as string
          );
          if (user) {
            if (isPasswordCorrect) {
              return Promise.resolve(user);
            } else {
              throw new Error("Incorrect Credentials!");
            }
          } else {
            throw new Error("No such user found!");
          }
        } catch (err) {
          throw new Error(err as string);
        }
      },
    }),
  ],
  pages: {
    signIn: "/login",
  },
  session: {
    strategy: "jwt",
    maxAge: 24 * 60 * 60, // 1 day
    updateAge: 60 * 60, // 1 hour
  },
  callbacks: {
    session: async ({ session, token }) => {
      if (session?.user) {
        session.user.id = token.uid as string;
      }
      return session;
    },
    async jwt({ token, user }: any) {
      if (user) {
        let { password, ...userInfo } = user;
        token.role = userInfo.role;
        token.user = userInfo;
      }
      return token;
    },
  },
} satisfies NextAuthConfig;
middleware.ts

import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
import createIntlMiddleware from "next-intl/middleware";
import { auth } from "auth";

const locales = ["en", "de", "ru", "fr"];
const authPages = ["/login", "/register"];
const publicPages = [
  "/",
  "/login",
  "/register",
  "/create-reservation",
  "/services",
  "/contact",
  "/about-us",
  "/mission-vision",
  "/our-privacy-policy",
  "/query",
];

const intlMiddleware = createIntlMiddleware({
  locales,
  defaultLocale: "en",
  localePrefix: "always",
});
const testPathnameRegex = (pages: string[], pathName: string): boolean => {
  return RegExp(
    `^(/(${locales.join("|")}))?(${pages
      .flatMap((p) => (p === "/" ? ["", "/"] : p))
      .join("|")})/?$`,
    "i"
  ).test(pathName);
};

const authMiddleware = auth((req) => {
  const isAuthPage = testPathnameRegex(authPages, req.nextUrl.pathname);
  const session = req.auth;

  // Redirect to sign-in page if not authenticated
  if (!session && !isAuthPage) {
    return NextResponse.redirect(new URL("/login", req.nextUrl));
  }

  // Redirect to home page if authenticated and trying to access auth pages
  if (session && isAuthPage) {
    return NextResponse.redirect(new URL("/", req.nextUrl));
  }

  return intlMiddleware(req);
});

const middleware = (req: NextRequest) => {
  const isPublicPage = testPathnameRegex(publicPages, req.nextUrl.pathname);
  const isAuthPage = testPathnameRegex(authPages, req.nextUrl.pathname);

  if (isAuthPage) {
    return (authMiddleware as any)(req);
  }

  if (isPublicPage) {
    return intlMiddleware(req);
  } else {
    return (authMiddleware as any)(req);
  }
};

export const config = {
  matcher: ["/((?!api|_next|.*\\..*).*)"],
};

export default middleware;
Plesk Console
Is there anyone?
IG it's error related to docker, plesk, whatever it is. I doubt you'll get that much help here, it isn't really next.js related question here.
you've deployed it wrongly ig
can you try upgrading to latest next version?
@averydelusionalperson can you try upgrading to latest next version?
The site is already working, there is no problem other than "Interval Server Error", I think it is related to "next-auth".
Since I cannot "/login", I cannot access the "/panel" (admin) page.
did you try setting NEXTAUTH_URL?
seems like something related to it to me
this is the version “next 14.1.1”
yeah, IK. saw the screenshot
@MeKa Is there anyone?
please do not bump then delete and bump again
@joulev please do not bump then delete and bump again
Ok sir, thank you
Sun bear
Not sure if it works but you could try the following
FROM node:16-alpine

WORKDIR /app

COPY package.json ./
COPY package-lock.json ./
RUN npm ci --production

COPY . .

ENV NODE_ENV production

RUN npm run build

EXPOSE 3000

CMD ["npm", "start"]
Sun bear
Try following these instructions and hopefully it will work.