From b9fc8f200bfb45839af4e79a011dc287da5f84f3 Mon Sep 17 00:00:00 2001 From: vchikalkin Date: Mon, 26 Feb 2024 15:45:09 +0300 Subject: [PATCH] Docker: use pnpm --- README.md | 104 +++++++++++++++++++++++++------------------- apps/api/Dockerfile | 17 +++++--- apps/api/README.md | 14 +++--- apps/web/Dockerfile | 15 ++++--- apps/web/README.md | 18 +++++--- package.json | 2 +- 6 files changed, 101 insertions(+), 69 deletions(-) diff --git a/README.md b/README.md index d7a14e5..a2582b9 100644 --- a/README.md +++ b/README.md @@ -1,59 +1,28 @@ -# Turborepo Docker starter +# Turborepo starter -This is an official Docker starter Turborepo. - -## What's inside? - -This turborepo uses [Yarn](https://classic.yarnpkg.com/lang/en/) as a package manager. It includes the following packages/apps: - -### Apps and Packages - -- `web`: a [Next.js](https://nextjs.org/) app -- `api`: an [Express](https://expressjs.com/) server -- `ui`: ui: a React component library -- `eslint-config-custom`: `eslint` configurations for client side applications (includes `eslint-config-next` and `eslint-config-prettier`) -- `eslint-config-custom-server`: `eslint` configurations for server side applications (includes `eslint-config-next` and `eslint-config-prettier`) -- `scripts`: Jest configurations -- `logger`: Isomorphic logger (a small wrapper around console.log) -- `tsconfig`: tsconfig.json;s used throughout the monorepo - -Each package/app is 100% [TypeScript](https://www.typescriptlang.org/). +This is an official starter Turborepo. ## Using this example Run the following command: ```sh -npx degit vercel/turbo/examples/with-docker with-docker -cd with-docker -yarn install -git init . && git add . && git commit -m "Init" +npx create-turbo@latest ``` -### Docker +## What's inside? -This repo is configured to be built with Docker, and Docker compose. To build all apps in this repo: +This Turborepo includes the following packages/apps: -``` -# Create a network, which allows containers to communicate -# with each other, by using their container name as a hostname -docker network create app_network +### Apps and Packages -# Build prod using new BuildKit engine -COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker-compose -f docker-compose.yml build --parallel +- `docs`: a [Next.js](https://nextjs.org/) app +- `web`: another [Next.js](https://nextjs.org/) app +- `@repo/ui`: a stub React component library shared by both `web` and `docs` applications +- `@repo/eslint-config`: `eslint` configurations (includes `eslint-config-next` and `eslint-config-prettier`) +- `@repo/tsconfig`: `tsconfig.json`s used throughout the monorepo -# Start prod in detached mode -docker-compose -f docker-compose.yml up -d -``` - -Open http://localhost:3000. - -To shutdown all running containers: - -``` -# Stop all running containers -docker kill $(docker ps -q) && docker rm $(docker ps -a -q) -``` +Each package/app is 100% [TypeScript](https://www.typescriptlang.org/). ### Utilities @@ -61,5 +30,52 @@ This Turborepo has some additional tools already setup for you: - [TypeScript](https://www.typescriptlang.org/) for static type checking - [ESLint](https://eslint.org/) for code linting -- [Jest](https://jestjs.io) test runner for all things JavaScript - [Prettier](https://prettier.io) for code formatting + +### Build + +To build all apps and packages, run the following command: + +``` +cd my-turborepo +pnpm build +``` + +### Develop + +To develop all apps and packages, run the following command: + +``` +cd my-turborepo +pnpm dev +``` + +### Remote Caching + +Turborepo can use a technique known as [Remote Caching](https://turbo.build/repo/docs/core-concepts/remote-caching) to share cache artifacts across machines, enabling you to share build caches with your team and CI/CD pipelines. + +By default, Turborepo will cache locally. To enable Remote Caching you will need an account with Vercel. If you don't have an account you can [create one](https://vercel.com/signup), then enter the following commands: + +``` +cd my-turborepo +npx turbo login +``` + +This will authenticate the Turborepo CLI with your [Vercel account](https://vercel.com/docs/concepts/personal-accounts/overview). + +Next, you can link your Turborepo to your Remote Cache by running the following command from the root of your Turborepo: + +``` +npx turbo link +``` + +## Useful Links + +Learn more about the power of Turborepo: + +- [Tasks](https://turbo.build/repo/docs/core-concepts/monorepos/running-tasks) +- [Caching](https://turbo.build/repo/docs/core-concepts/caching) +- [Remote Caching](https://turbo.build/repo/docs/core-concepts/remote-caching) +- [Filtering](https://turbo.build/repo/docs/core-concepts/monorepos/filtering) +- [Configuration Options](https://turbo.build/repo/docs/reference/configuration) +- [CLI Usage](https://turbo.build/repo/docs/reference/command-line-reference) diff --git a/apps/api/Dockerfile b/apps/api/Dockerfile index ebd9cb5..0df44c7 100644 --- a/apps/api/Dockerfile +++ b/apps/api/Dockerfile @@ -2,17 +2,21 @@ # Make sure you update both files! FROM node:alpine AS builder +RUN corepack enable && corepack prepare pnpm@latest --activate +ENV PNPM_HOME=/usr/local/bin # Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. RUN apk add --no-cache libc6-compat RUN apk update # Set working directory WORKDIR /app -RUN yarn global add turbo +RUN pnpm add -g turbo dotenv-cli COPY . . RUN turbo prune --scope=api --docker # Add lockfile and package.json's of isolated subworkspace FROM node:alpine AS installer +RUN corepack enable && corepack prepare pnpm@latest --activate +ENV PNPM_HOME=/usr/local/bin RUN apk add --no-cache libc6-compat RUN apk update WORKDIR /app @@ -20,14 +24,15 @@ WORKDIR /app # First install dependencies (as they change less often) COPY .gitignore .gitignore COPY --from=builder /app/out/json/ . -COPY --from=builder /app/out/yarn.lock ./yarn.lock -RUN yarn install +COPY --from=builder /app/out/pnpm-lock.yaml ./pnpm-lock.yaml +COPY --from=builder /app/out/pnpm-workspace.yaml ./pnpm-workspace.yaml +RUN pnpm install # Build the project and its dependencies COPY --from=builder /app/out/full/ . COPY turbo.json turbo.json -# COPY .env .env -RUN yarn turbo run build --filter=api... +COPY .env .env +RUN pnpm dotenv -e .env turbo run build --filter=api... FROM node:alpine AS runner WORKDIR /app @@ -38,4 +43,4 @@ RUN adduser --system --uid 1001 nestjs USER nestjs COPY --from=installer /app . -CMD node apps/api/dist/main.js \ No newline at end of file +CMD node apps/api/dist/main.js diff --git a/apps/api/README.md b/apps/api/README.md index 8372941..f5aa86c 100644 --- a/apps/api/README.md +++ b/apps/api/README.md @@ -29,33 +29,33 @@ ## Installation ```bash -$ yarn install +$ pnpm install ``` ## Running the app ```bash # development -$ yarn run start +$ pnpm run start # watch mode -$ yarn run start:dev +$ pnpm run start:dev # production mode -$ yarn run start:prod +$ pnpm run start:prod ``` ## Test ```bash # unit tests -$ yarn run test +$ pnpm run test # e2e tests -$ yarn run test:e2e +$ pnpm run test:e2e # test coverage -$ yarn run test:cov +$ pnpm run test:cov ``` ## Support diff --git a/apps/web/Dockerfile b/apps/web/Dockerfile index 63ed9eb..e4ed170 100644 --- a/apps/web/Dockerfile +++ b/apps/web/Dockerfile @@ -2,17 +2,21 @@ # Make sure you update both files! FROM node:alpine AS builder +RUN corepack enable && corepack prepare pnpm@latest --activate +ENV PNPM_HOME=/usr/local/bin # Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. RUN apk add --no-cache libc6-compat RUN apk update # Set working directory WORKDIR /app -RUN yarn global add turbo +RUN pnpm add -g turbo dotenv-cli COPY . . RUN turbo prune --scope=web --docker # Add lockfile and package.json's of isolated subworkspace FROM node:alpine AS installer +RUN corepack enable && corepack prepare pnpm@latest --activate +ENV PNPM_HOME=/usr/local/bin RUN apk add --no-cache libc6-compat RUN apk update WORKDIR /app @@ -20,8 +24,9 @@ WORKDIR /app # First install the dependencies (as they change less often) COPY .gitignore .gitignore COPY --from=builder /app/out/json/ . -COPY --from=builder /app/out/yarn.lock ./yarn.lock -RUN yarn install +COPY --from=builder /app/out/pnpm-lock.yaml ./pnpm-lock.yaml +COPY --from=builder /app/out/pnpm-workspace.yaml ./pnpm-workspace.yaml +RUN pnpm install # Build the project COPY --from=builder /app/out/full/ . @@ -42,7 +47,7 @@ ARG URL_CORE_CALCULATE_DIRECT ARG URL_1C_TRANSTAX_DIRECT ARG URL_ELT_OSAGO_DIRECT ARG URL_ELT_KASKO_DIRECT -RUN yarn turbo run build --filter=web... +RUN pnpm dotenv -e .env turbo run build --filter=web... FROM node:alpine AS runner WORKDIR /app @@ -61,4 +66,4 @@ COPY --from=installer --chown=nextjs:nodejs /app/apps/web/.next/standalone ./ COPY --from=installer --chown=nextjs:nodejs /app/apps/web/.next/static ./apps/web/.next/static COPY --from=installer --chown=nextjs:nodejs /app/apps/web/public ./apps/web/public -CMD node apps/web/server.js +CMD node apps/web/server.js \ No newline at end of file diff --git a/apps/web/README.md b/apps/web/README.md index 4fae62a..c403366 100644 --- a/apps/web/README.md +++ b/apps/web/README.md @@ -1,30 +1,36 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + ## Getting Started First, run the development server: ```bash +npm run dev +# or yarn dev +# or +pnpm dev +# or +bun dev ``` Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. -You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file. +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. -[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.js`. - -The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. ## Learn More To learn more about Next.js, take a look at the following resources: - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn/foundations/about-nextjs) - an interactive Next.js tutorial. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! ## Deploy on Vercel -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_source=github.com&utm_medium=referral&utm_campaign=turborepo-readme) from the creators of Next.js. +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/package.json b/package.json index 244efe8..c3de3a5 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "lint:fix": "dotenv -e .env.local turbo run lint:fix", "test": "dotenv -e .env.local turbo run test", "prepare": "husky install", - "precommit": "yarn format && yarn lint:fix && yarn test", + "precommit": "pnpm format && pnpm lint:fix && pnpm test", "graphql:update": "dotenv -e .env.local node ./scripts/graphql-update.js", "graphql:codegen": "dotenv -e .env.local node ./scripts/graphql-codegen.js" },