diff --git a/apps/hub-server/Dockerfile b/apps/hub-server/Dockerfile index cfce4bee..26bee520 100644 --- a/apps/hub-server/Dockerfile +++ b/apps/hub-server/Dockerfile @@ -1,31 +1,48 @@ -FROM node:22-alpine +FROM node:22-alpine AS base -ENV NODE_ENV=production +ENV PNPM_HOME="/usr/local/pnpm" +ENV PATH="${PNPM_HOME}:${PATH}" +RUN corepack enable && corepack prepare pnpm@latest --activate + +RUN pnpm add -g turbo@^2.5 + +FROM base AS builder +RUN apk update +RUN apk add --no-cache libc6-compat -# Set the working directory WORKDIR /usr/app -# Copy package.json and package-lock.json -COPY package*.json ./ - -# Install dependencies -RUN npm install - -# Change ownership to the non-root user -RUN chown -R node:node /usr/app - -# Copy the rest of the application code COPY . . -# Build the application -RUN npm run build +RUN turbo prune hub-server --docker + +FROM base AS installer +RUN apk update +RUN apk add --no-cache libc6-compat + +WORKDIR /usr/app + +COPY --from=builder /usr/app/out/json/ . +RUN pnpm install --frozen-lockfile + +# Build the project +COPY --from=builder /usr/app/out/full/ . + +RUN turbo run build + +FROM base AS runner +WORKDIR /usr/app + +# Don't run production as root +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs +USER nextjs + +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing +COPY --from=installer --chown=nextjs:nodejs /usr/app/ ./ # Expose the application port EXPOSE 3003 -# Run container as non-root (unprivileged) user -# The "node" user is provided in the Node.js Alpine base image -USER node - -# Command to run the application -CMD ["node", "index.js"] \ No newline at end of file +CMD ["pnpm", "--dir", "apps/hub-server", "run", "start"] \ No newline at end of file diff --git a/apps/hub-server/package.json b/apps/hub-server/package.json index 6625cc67..68a82b21 100644 --- a/apps/hub-server/package.json +++ b/apps/hub-server/package.json @@ -5,13 +5,17 @@ }, "scripts": { "dev": "nodemon --signal SIGINT", + "start": "node index.js", "build": "tsc" }, "devDependencies": { "@repo/db": "*", "@repo/typescript-config": "*", + "@types/cors": "^2.8.18", + "@types/express": "^5.0.2", "@types/node": "^22.13.5", "@types/nodemailer": "^6.4.17", + "@types/react": "^19.1.5", "concurrently": "^9.1.2", "typescript": "latest" }, diff --git a/apps/hub-server/routes/mail.ts b/apps/hub-server/routes/mail.ts index 2ef4c4b1..0c0629bb 100644 --- a/apps/hub-server/routes/mail.ts +++ b/apps/hub-server/routes/mail.ts @@ -2,7 +2,7 @@ import { Router } from "express"; import { sendMail } from "modules/mail"; import { sendPasswordChanged, sendCourseCompletedEmail } from "modules/mail"; -const router = Router(); +const router: Router = Router(); router.post("/send", async (req, res) => { const { to, subject, html } = req.body; diff --git a/apps/hub-server/routes/router.ts b/apps/hub-server/routes/router.ts index cc322f43..49dd5d77 100644 --- a/apps/hub-server/routes/router.ts +++ b/apps/hub-server/routes/router.ts @@ -1,7 +1,7 @@ import { Router } from "express"; import mailRouter from "./mail"; -const router = Router(); +const router: Router = Router(); router.use("/mail", mailRouter); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 32073e91..1f05d412 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -393,12 +393,21 @@ importers: '@repo/typescript-config': specifier: '*' version: link:../../packages/typescript-config + '@types/cors': + specifier: ^2.8.18 + version: 2.8.18 + '@types/express': + specifier: ^5.0.2 + version: 5.0.2 '@types/node': specifier: ^22.13.5 version: 22.15.21 '@types/nodemailer': specifier: ^6.4.17 version: 6.4.17 + '@types/react': + specifier: ^19.1.5 + version: 19.1.5 concurrently: specifier: ^9.1.2 version: 9.1.2