t3-oss / create-t3-turbo

Clean and simple starter repo using the T3 Stack along with Expo React Native
https://turbo.t3.gg
MIT License
4.73k stars 408 forks source link

feat: Implement docker deployment #111

Open pieter-berkel opened 1 year ago

pieter-berkel commented 1 year ago

Describe the feature you'd like to request

I would like to see how to deploy with docker, maybe in the template or at least in the documentation.

Describe the solution you'd like to see

I would like to see a docker example in the documentation.

Additional information

I already tried with the normal turborepo example but this fails because this template uses pnpm.

juliusmarminge commented 1 year ago

I'd be open for this - however we currently have some issues getting a normal T3 app Docker setup going so I think I'll wait until that one has been resolved before attempting to set it up for monorepos.

Follow it here: https://github.com/t3-oss/create-t3-app/issues/992

pmioduszewski commented 1 year ago

Did someone figure it out?

EkkoKo commented 1 year ago

@pmioduszewski yes! I've created a PR for it right now you can go check it out https://github.com/t3-oss/create-t3-turbo/pull/255

Feel free to ask me questions / review it if you think there are stuff that can be written better :)

oldo commented 1 year ago

Thanks @EkkoKo By taking a squiz at your PR I was able to resolve issues I was having running in docker. I was going around in circles all morning till I found your work!

akutruff commented 1 year ago

I did a bunch of work to dockerize this repo for fly.io. It's all here:

https://github.com/kutruff/fly-t3-turbo

(It's based on EkkOko's PR.)

raphaelm-gioa commented 10 months ago

What about deploying using SST ? Would that be doable even ?

bryanjtc commented 5 months ago

Any update on this?

noxify commented 5 months ago

@bryanjtc - i don't think so.

But there is a new medium articel for this topic: https://fintlabs.medium.com/optimized-multi-stage-docker-builds-with-turborepo-and-pnpm-for-nodejs-microservices-in-a-monorepo-c686fdcf051f

Maybe it helps to get started :)

bryanjtc commented 5 months ago

I ended up using this Dockerfile from the official turbo docker example https://github.com/vercel/turbo/blob/main/examples/with-docker/apps/web/Dockerfile It works perfectly.

Security2431 commented 4 weeks ago

I wanted to share with you a working Dockerfile for creating a create-t3-turbo and Next.js app.

You can find the repository on GitHub at: https://github.com/Security2431/create-t3-turbo-with-prisma/blob/main/apps/nextjs/Dockerfile

To execute a Dockerfile, open a terminal and run the following command:

docker build -f apps/nextjs/Dockerfile -t create-t3-turbo-with-prisma:latest .

Just in case, sharing the Dockerfile content here:

ARG NODE_VERSION=20
ARG APP_DIRNAME=nextjs
ARG PROJECT=@acme/nextjs

# 1. Alpine image
FROM node:${NODE_VERSION}-alpine AS alpine
RUN apk update
RUN apk add --no-cache libc6-compat

# Setup pnpm and turbo on the alpine base
FROM alpine AS base
RUN corepack enable
# Replace <your-major-version> with the major version installed in your repository. For example:
# RUN npm install turbo@2.1.3 --global
RUN npm install turbo --global

RUN pnpm config set store-dir ~/.pnpm-store

# 2. Prune projects
FROM base AS pruner
# https://stackoverflow.com/questions/49681984/how-to-get-version-value-of-package-json-inside-of-dockerfile
# RUN export VERSION=$(npm run version)

ARG PROJECT

# Set working directory
WORKDIR /app

# It might be the path to <ROOT> turborepo
COPY . .

# Generate a partial monorepo with a pruned lockfile for a target workspace.
# Assuming "@acme/nextjs" is the name entered in the project's package.json: { name: "@acme/nextjs" }
RUN turbo prune --scope=${PROJECT} --docker

# 3. Build the project
FROM base AS builder
ARG PROJECT

# Environment to skip .env validation on build
ENV CI=true

WORKDIR /app

# Copy lockfile and package.json's of isolated subworkspace
COPY --from=pruner /app/out/pnpm-lock.yaml ./pnpm-lock.yaml
COPY --from=pruner /app/out/pnpm-workspace.yaml ./pnpm-workspace.yaml
COPY --from=pruner /app/out/json/ .

# First install the dependencies (as they change less often)
RUN --mount=type=cache,id=pnpm,target=~/.pnpm-store pnpm install --frozen-lockfile

# Copy source code of isolated subworkspace
COPY --from=pruner /app/out/full/ .

RUN pnpm build --filter=${PROJECT}

# 4. Final image - runner stage to run the application
FROM base AS runner
ARG APP_DIRNAME

# Don't run production as root
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
USER nextjs

WORKDIR /app

ENV NODE_ENV=production

COPY --from=builder --chown=nodejs:nextjs /app .
WORKDIR /app/apps/${APP_DIRNAME}

ARG PORT=3000
ENV PORT=${PORT}
EXPOSE ${PORT}

CMD ["pnpm", "start"]