From 0c8a89a2eaf6daf22916f3fa736becbc111752a6 Mon Sep 17 00:00:00 2001 From: Adithya Krishna Date: Fri, 1 Mar 2024 12:53:51 +0530 Subject: [PATCH 01/17] feat: add typefully card Signed-off-by: Adithya Krishna --- .../src/app/(marketing)/open/cap-table.tsx | 3 +- .../src/app/(marketing)/open/page.tsx | 3 ++ .../src/app/(marketing)/open/typefully.tsx | 47 ++++++++++++++++++ packages/assets/twitter-icon.png | Bin 0 -> 14293 bytes 4 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 apps/marketing/src/app/(marketing)/open/typefully.tsx create mode 100644 packages/assets/twitter-icon.png diff --git a/apps/marketing/src/app/(marketing)/open/cap-table.tsx b/apps/marketing/src/app/(marketing)/open/cap-table.tsx index ca63bd7bf..ba6a12dc4 100644 --- a/apps/marketing/src/app/(marketing)/open/cap-table.tsx +++ b/apps/marketing/src/app/(marketing)/open/cap-table.tsx @@ -1,6 +1,7 @@ 'use client'; -import { HTMLAttributes, useEffect, useState } from 'react'; +import type { HTMLAttributes } from 'react'; +import { useEffect, useState } from 'react'; import { Cell, Legend, Pie, PieChart, Tooltip } from 'recharts'; diff --git a/apps/marketing/src/app/(marketing)/open/page.tsx b/apps/marketing/src/app/(marketing)/open/page.tsx index 76de85fcf..8fef81134 100644 --- a/apps/marketing/src/app/(marketing)/open/page.tsx +++ b/apps/marketing/src/app/(marketing)/open/page.tsx @@ -15,6 +15,7 @@ import { MonthlyNewUsersChart } from './monthly-new-users-chart'; import { MonthlyTotalUsersChart } from './monthly-total-users-chart'; import { TeamMembers } from './team-members'; import { OpenPageTooltip } from './tooltip'; +import { Typefully } from './typefully'; export const metadata: Metadata = { title: 'Open Startup', @@ -237,6 +238,8 @@ export default async function OpenPage() { + +

Where's the rest?

diff --git a/apps/marketing/src/app/(marketing)/open/typefully.tsx b/apps/marketing/src/app/(marketing)/open/typefully.tsx new file mode 100644 index 000000000..1a927d4d6 --- /dev/null +++ b/apps/marketing/src/app/(marketing)/open/typefully.tsx @@ -0,0 +1,47 @@ +'use client'; + +import type { HTMLAttributes } from 'react'; +import { useEffect, useState } from 'react'; + +import Image from 'next/image'; +import Link from 'next/link'; + +import Twitter from '@documenso/assets/twitter-icon.png'; +import { cn } from '@documenso/ui/lib/utils'; +import { Button } from '@documenso/ui/primitives/button'; + +export type TypefullyProps = HTMLAttributes; + +export const Typefully = ({ className, ...props }: TypefullyProps) => { + const [isSSR, setIsSSR] = useState(true); + + useEffect(() => { + setIsSSR(false); + }, []); + return ( +
+

Twitter Stats

+ +
+ {!isSSR && ( +
+ Twitter Logo + +

Documenso on X

+ + + +
+ )} +
+
+ ); +}; diff --git a/packages/assets/twitter-icon.png b/packages/assets/twitter-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f1da461c2d3a56e5772bce09065abaa8d25a8fbe GIT binary patch literal 14293 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 Date: Tue, 5 Mar 2024 14:57:29 +0530 Subject: [PATCH 02/17] chore: updated styling of tooltips and margins Signed-off-by: Adithya Krishna --- .../src/app/(marketing)/open/monthly-new-users-chart.tsx | 5 ++++- .../src/app/(marketing)/open/monthly-total-users-chart.tsx | 5 ++++- apps/marketing/src/app/(marketing)/open/typefully.tsx | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx b/apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx index b96bbf50d..0df73e30c 100644 --- a/apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx +++ b/apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx @@ -14,7 +14,7 @@ export type MonthlyNewUsersChartProps = { export const MonthlyNewUsersChart = ({ className, data }: MonthlyNewUsersChartProps) => { const formattedData = [...data].reverse().map(({ month, count }) => { return { - month: DateTime.fromFormat(month, 'yyyy-MM').toFormat('LLL'), + month: DateTime.fromFormat(month, 'yyyy-MM').toFormat('LLLL'), count: Number(count), }; }); @@ -32,6 +32,9 @@ export const MonthlyNewUsersChart = ({ className, data }: MonthlyNewUsersChartPr [Number(value).toLocaleString('en-US'), 'New Users']} cursor={{ fill: 'hsl(var(--primary) / 10%)' }} /> diff --git a/apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx b/apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx index e31bb9def..96ce34556 100644 --- a/apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx +++ b/apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx @@ -14,7 +14,7 @@ export type MonthlyTotalUsersChartProps = { export const MonthlyTotalUsersChart = ({ className, data }: MonthlyTotalUsersChartProps) => { const formattedData = [...data].reverse().map(({ month, cume_count: count }) => { return { - month: DateTime.fromFormat(month, 'yyyy-MM').toFormat('LLL'), + month: DateTime.fromFormat(month, 'yyyy-MM').toFormat('LLLL'), count: Number(count), }; }); @@ -32,6 +32,9 @@ export const MonthlyTotalUsersChart = ({ className, data }: MonthlyTotalUsersCha [Number(value).toLocaleString('en-US'), 'Total Users']} cursor={{ fill: 'hsl(var(--primary) / 10%)' }} /> diff --git a/apps/marketing/src/app/(marketing)/open/typefully.tsx b/apps/marketing/src/app/(marketing)/open/typefully.tsx index 1a927d4d6..809b0f6c3 100644 --- a/apps/marketing/src/app/(marketing)/open/typefully.tsx +++ b/apps/marketing/src/app/(marketing)/open/typefully.tsx @@ -22,7 +22,7 @@ export const Typefully = ({ className, ...props }: TypefullyProps) => {

Twitter Stats

-
+
{!isSSR && (
Twitter Logo From a03ce728f35791d09eafc13a4420052fe33c47b0 Mon Sep 17 00:00:00 2001 From: Adithya Krishna Date: Tue, 5 Mar 2024 15:34:42 +0530 Subject: [PATCH 03/17] chore: remove ssr Signed-off-by: Adithya Krishna --- .../src/app/(marketing)/open/typefully.tsx | 36 ++++++++----------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/apps/marketing/src/app/(marketing)/open/typefully.tsx b/apps/marketing/src/app/(marketing)/open/typefully.tsx index 809b0f6c3..98f4186d0 100644 --- a/apps/marketing/src/app/(marketing)/open/typefully.tsx +++ b/apps/marketing/src/app/(marketing)/open/typefully.tsx @@ -1,7 +1,6 @@ 'use client'; import type { HTMLAttributes } from 'react'; -import { useEffect, useState } from 'react'; import Image from 'next/image'; import Link from 'next/link'; @@ -13,34 +12,27 @@ import { Button } from '@documenso/ui/primitives/button'; export type TypefullyProps = HTMLAttributes; export const Typefully = ({ className, ...props }: TypefullyProps) => { - const [isSSR, setIsSSR] = useState(true); - - useEffect(() => { - setIsSSR(false); - }, []); return (

Twitter Stats

- {!isSSR && ( -
- Twitter Logo +
+ Twitter Logo + +

Documenso on X

+ + - -
- )} + + +
); From e83a4beceeb9dbcf46b8000920a4c3a40d2bb815 Mon Sep 17 00:00:00 2001 From: Adithya Krishna Date: Tue, 5 Mar 2024 15:41:34 +0530 Subject: [PATCH 04/17] chore: update twitter logo Signed-off-by: Adithya Krishna --- apps/marketing/src/app/(marketing)/open/typefully.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/marketing/src/app/(marketing)/open/typefully.tsx b/apps/marketing/src/app/(marketing)/open/typefully.tsx index 98f4186d0..a233904db 100644 --- a/apps/marketing/src/app/(marketing)/open/typefully.tsx +++ b/apps/marketing/src/app/(marketing)/open/typefully.tsx @@ -2,10 +2,10 @@ import type { HTMLAttributes } from 'react'; -import Image from 'next/image'; import Link from 'next/link'; -import Twitter from '@documenso/assets/twitter-icon.png'; +import { FaXTwitter } from 'react-icons/fa6'; + import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; @@ -17,8 +17,8 @@ export const Typefully = ({ className, ...props }: TypefullyProps) => {

Twitter Stats

-
- Twitter Logo +
+

Documenso on X

From 41ccefe212e829b85091c3dd6b0481c2353d82a7 Mon Sep 17 00:00:00 2001 From: Adithya Krishna Date: Tue, 5 Mar 2024 15:43:33 +0530 Subject: [PATCH 05/17] chore: remove twt logo asset Signed-off-by: Adithya Krishna --- packages/assets/twitter-icon.png | Bin 14293 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 packages/assets/twitter-icon.png diff --git a/packages/assets/twitter-icon.png b/packages/assets/twitter-icon.png deleted file mode 100644 index f1da461c2d3a56e5772bce09065abaa8d25a8fbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14293 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 Date: Wed, 6 Mar 2024 15:46:51 +1100 Subject: [PATCH 06/17] feat: tidy docker setup Tidy the docker setup and include a Github Action for publishing docker containers to DockerHub and Github Container Registry. Also add a small README file with docker hosting instructions. --- .github/workflows/publish.yml | 40 ++++++ docker/Dockerfile | 7 +- docker/README.md | 128 ++++++++++++++++++ docker/build.sh | 16 +-- docker/buildx.sh | 28 ++++ docker/compose-entrypoint.sh | 12 -- docker/compose-without-app.yml | 19 --- docker/compose.yml | 40 ------ .../compose.yml} | 3 +- docker/production/compose.yml | 63 +++++++++ docker/start.sh | 5 + .../{compose-test.yml => testing/compose.yml} | 17 +-- package.json | 4 +- 13 files changed, 290 insertions(+), 92 deletions(-) create mode 100644 .github/workflows/publish.yml create mode 100644 docker/README.md create mode 100755 docker/buildx.sh delete mode 100755 docker/compose-entrypoint.sh delete mode 100644 docker/compose-without-app.yml delete mode 100644 docker/compose.yml rename docker/{compose-services.yml => development/compose.yml} (96%) create mode 100644 docker/production/compose.yml create mode 100755 docker/start.sh rename docker/{compose-test.yml => testing/compose.yml} (75%) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 000000000..5792dcb78 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,40 @@ +name: Publish Docker + +on: + push: + branches: ['release'] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to DockerHub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GH_TOKEN }} + + - name: Build the docker image + run: ./docker/build.sh + + - name: Push the docker image to DockerHub + run: docker push --all-tags documenso/documenso + + - name: Push the docker image to GitHub Container Registry + run: docker push --all-tags ghcr.io/documenso/documenso diff --git a/docker/Dockerfile b/docker/Dockerfile index 4952b0bbd..55012df48 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -32,6 +32,7 @@ RUN apk add --no-cache libc6-compat RUN apk add --no-cache jq # Required for node_modules/aws-crt RUN apk add --no-cache make cmake g++ + WORKDIR /app # Disable husky from installing hooks @@ -80,6 +81,7 @@ WORKDIR /app # Don't run production as root RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs + USER nextjs COPY --from=installer /app/apps/web/next.config.js . @@ -91,4 +93,7 @@ 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 +# Get the start script from docker/start.sh +COPY --chown=nextjs:nodejs /docker/start.sh . + +CMD start.sh diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 000000000..addb278c4 --- /dev/null +++ b/docker/README.md @@ -0,0 +1,128 @@ +# Docker Setup for Documenso + +The following guide will walk you through setting up Documenso using Docker. You can choose between a production setup using Docker Compose or a standalone container. + +## Prerequisites + +Before you begin, ensure that you have the following installed: + +- Docker +- Docker Compose (if using the Docker Compose setup) + +## Option 1: Production Docker Compose Setup + +This setup includes a PostgreSQL database and the Documenso application. You will need to provide your own SMTP details via environment variables. + +1. Download the Docker Compose file from the Documenso repository: [compose.yml](https://raw.githubusercontent.com/documenso/documenso/release/docker/production/compose.yml) +2. Navigate to the directory containing the `compose.yml` file. +3. Create a `.env` file in the same directory and add your SMTP details as well as a few extra environment variables, following the example below: + +``` +NEXTAUTH_SECRET="" +NEXT_PRIVATE_ENCRYPTION_KEY="" +NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY="" +NEXT_PUBLIC_WEBAPP_URL="" +NEXT_PRIVATE_SMTP_TRANSPORT="smtp-auth" +NEXT_PRIVATE_SMTP_HOST="" +NEXT_PRIVATE_SMTP_PORT= +NEXT_PRIVATE_SMTP_USERNAME="" +NEXT_PRIVATE_SMTP_PASSWORD="" +``` + +4. Run the following command to start the containers: + +``` +docker-compose --env-file ./.env -d up +``` + +This will start the PostgreSQL database and the Documenso application containers. + +5. Access the Documenso application by visiting `http://localhost:3000` in your web browser. + +## Option 2: Standalone Docker Container + +If you prefer to host the Documenso application on your container provider of choice, you can use the pre-built Docker image from DockerHub or GitHub's Package Registry. Note that you will need to provide your own database and SMTP host. + +1. Pull the Documenso Docker image: + +``` +docker pull documenso/documenso +``` + +Or, if using GitHub's Package Registry: + +``` +docker pull ghcr.io/documenso/documenso +``` + +2. Run the Docker container, providing the necessary environment variables for your database and SMTP host: + +``` +docker run -d \ + -p 3000:3000 \ + -e POSTGRES_USER="" + -e POSTGRES_PASSWORD="" + -e POSTGRES_DB="" + -e NEXTAUTH_URL="" + -e NEXTAUTH_SECRET="" + -e NEXT_PRIVATE_ENCRYPTION_KEY="" + -e NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY="" + -e NEXT_PUBLIC_WEBAPP_URL="" + -e NEXT_PRIVATE_DATABASE_URL="" + -e NEXT_PRIVATE_SMTP_TRANSPORT="" + -e NEXT_PRIVATE_SMTP_FROM_NAME="" + -e NEXT_PRIVATE_SMTP_FROM_ADDRESS="" + documenso/documenso +``` + +Replace the placeholders with your actual database and SMTP details. + +1. Access the Documenso application by visiting the URL you provided in the `NEXT_PUBLIC_WEBAPP_URL` environment variable in your web browser. + +## Success + +You have now successfully set up Documenso using Docker. You can start organizing and managing your documents efficiently. If you encounter any issues or have further questions, please refer to the official Documenso documentation or seek assistance from the community. + +## Advanced Configuration + +The environment variables listed above are a subset of those that are available for configuring Documenso. For a complete list of environment variables and their descriptions, refer to the table below: + +Here's a markdown table documenting all the provided environment variables: + +| Variable | Description | +| -------------------------------------------- | --------------------------------------------------------------------------------------------------- | +| `PORT` | The port to run the Documenso application on, defaults to `3000`. | +| `NEXTAUTH_URL` | The URL for the NextAuth.js authentication service. | +| `NEXTAUTH_SECRET` | The secret key used by NextAuth.js for encryption and signing. | +| `NEXT_PRIVATE_ENCRYPTION_KEY` | The primary encryption key for symmetric encryption and decryption (at least 32 characters). | +| `NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY` | The secondary encryption key for symmetric encryption and decryption (at least 32 characters). | +| `NEXT_PRIVATE_GOOGLE_CLIENT_ID` | The Google client ID for Google authentication (optional). | +| `NEXT_PRIVATE_GOOGLE_CLIENT_SECRET` | The Google client secret for Google authentication (optional). | +| `NEXT_PUBLIC_WEBAPP_URL` | The URL for the web application. | +| `NEXT_PRIVATE_DATABASE_URL` | The URL for the primary database connection (with connection pooling). | +| `NEXT_PRIVATE_DIRECT_DATABASE_URL` | The URL for the direct database connection (without connection pooling). | +| `NEXT_PUBLIC_UPLOAD_TRANSPORT` | The transport to use for file uploads (database or s3). | +| `NEXT_PRIVATE_UPLOAD_ENDPOINT` | The endpoint for the S3 storage transport (for third-party S3-compatible providers). | +| `NEXT_PRIVATE_UPLOAD_REGION` | The region for the S3 storage transport (defaults to us-east-1). | +| `NEXT_PRIVATE_UPLOAD_BUCKET` | The bucket to use for the S3 storage transport. | +| `NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID` | The access key ID for the S3 storage transport. | +| `NEXT_PRIVATE_UPLOAD_SECRET_ACCESS_KEY` | The secret access key for the S3 storage transport. | +| `NEXT_PRIVATE_SMTP_TRANSPORT` | The transport to use for sending emails (smtp-auth, smtp-api, resend, or mailchannels). | +| `NEXT_PRIVATE_SMTP_HOST` | The host for the SMTP server for SMTP transports. | +| `NEXT_PRIVATE_SMTP_PORT` | The port for the SMTP server for SMTP transports. | +| `NEXT_PRIVATE_SMTP_USERNAME` | The username for the SMTP server for the `smtp-auth` transport. | +| `NEXT_PRIVATE_SMTP_PASSWORD` | The password for the SMTP server for the `smtp-auth` transport. | +| `NEXT_PRIVATE_SMTP_APIKEY_USER` | The API key user for the SMTP server for the `smtp-api` transport. | +| `NEXT_PRIVATE_SMTP_APIKEY` | The API key for the SMTP server for the `smtp-api` transport. | +| `NEXT_PRIVATE_SMTP_SECURE` | Whether to force the use of TLS for the SMTP server for SMTP transports. | +| `NEXT_PRIVATE_SMTP_FROM_ADDRESS` | The email address for the "from" address. | +| `NEXT_PRIVATE_SMTP_FROM_NAME` | The sender name for the "from" address. | +| `NEXT_PRIVATE_RESEND_API_KEY` | The API key for Resend.com for the `resend` transport. | +| `NEXT_PRIVATE_MAILCHANNELS_API_KEY` | The optional API key for MailChannels (if using a proxy) for the `mailchannels` transport. | +| `NEXT_PRIVATE_MAILCHANNELS_ENDPOINT` | The optional endpoint for the MailChannels API (if using a proxy) for the `mailchannels` transport. | +| `NEXT_PRIVATE_MAILCHANNELS_DKIM_DOMAIN` | The domain for DKIM signing with MailChannels for the `mailchannels` transport. | +| `NEXT_PRIVATE_MAILCHANNELS_DKIM_SELECTOR` | The selector for DKIM signing with MailChannels for the `mailchannels` transport. | +| `NEXT_PRIVATE_MAILCHANNELS_DKIM_PRIVATE_KEY` | The private key for DKIM signing with MailChannels for the `mailchannels` transport. | +| `NEXT_PUBLIC_DOCUMENT_SIZE_UPLOAD_LIMIT` | The maximum document upload limit displayed to the user (in MB). | +| `NEXT_PUBLIC_POSTHOG_KEY` | The optional PostHog key for analytics and feature flags. | +| `NEXT_PUBLIC_DISABLE_SIGNUP` | Whether to disable user signups through the /signup page. | diff --git a/docker/build.sh b/docker/build.sh index aa2068910..ca99ae8a9 100755 --- a/docker/build.sh +++ b/docker/build.sh @@ -5,15 +5,10 @@ command -v docker >/dev/null 2>&1 || { exit 1 } -command -v jq >/dev/null 2>&1 || { - echo "jq is not installed. Please install jq and try again." - exit 1 -} - SCRIPT_DIR="$(readlink -f "$(dirname "$0")")" MONOREPO_ROOT="$(readlink -f "$SCRIPT_DIR/../")" -APP_VERSION="$(jq -r '.version' "$MONOREPO_ROOT/apps/web/package.json")" +APP_VERSION="$(git name-rev --tags --name-only $(git rev-parse HEAD) | head -n 1 | sed 's/\^0//')" GIT_SHA="$(git rev-parse HEAD)" echo "Building docker image for monorepo at $MONOREPO_ROOT" @@ -22,7 +17,10 @@ echo "Git SHA: $GIT_SHA" docker build -f "$SCRIPT_DIR/Dockerfile" \ --progress=plain \ - -t "documenso:latest" \ - -t "documenso:$GIT_SHA" \ - -t "documenso:$APP_VERSION" \ + -t "documenso/documenso:latest" \ + -t "documenso/documenso:$GIT_SHA" \ + -t "documenso/documenso:$APP_VERSION" \ + -t "ghcr.io/documenso/documenso:latest" \ + -t "ghcr.io/documenso/documenso:$GIT_SHA" \ + -t "ghcr.io/documenso/documenso:$APP_VERSION" \ "$MONOREPO_ROOT" diff --git a/docker/buildx.sh b/docker/buildx.sh new file mode 100755 index 000000000..cdfdf69e4 --- /dev/null +++ b/docker/buildx.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +command -v docker >/dev/null 2>&1 || { + echo "Docker is not running. Please start Docker and try again." + exit 1 +} + +SCRIPT_DIR="$(readlink -f "$(dirname "$0")")" +MONOREPO_ROOT="$(readlink -f "$SCRIPT_DIR/../")" + +APP_VERSION="$(git name-rev --tags --name-only $(git rev-parse HEAD) | head -n 1 | sed 's/\^0//')" +GIT_SHA="$(git rev-parse HEAD)" + +echo "Building docker image for monorepo at $MONOREPO_ROOT" +echo "App version: $APP_VERSION" +echo "Git SHA: $GIT_SHA" + +docker buildx build \ + -f "$SCRIPT_DIR/Dockerfile" \ + --platform linux/amd64,linux/arm64 \ + --progress=plain \ + -t "documenso/documenso:latest" \ + -t "documenso/documenso:$GIT_SHA" \ + -t "documenso/documenso:$APP_VERSION" \ + -t "ghcr.io/documenso/documenso:latest" \ + -t "ghcr.io/documenso/documenso:$GIT_SHA" \ + -t "ghcr.io/documenso/documenso:$APP_VERSION" \ + "$MONOREPO_ROOT" diff --git a/docker/compose-entrypoint.sh b/docker/compose-entrypoint.sh deleted file mode 100755 index 2cf49a304..000000000 --- a/docker/compose-entrypoint.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -SCRIPT_DIR="$(readlink -f "$(dirname "$0")")" -MONOREPO_ROOT="$(readlink -f "$SCRIPT_DIR/../")" - -cd "$MONOREPO_ROOT" - -npm ci - -npm run prisma:migrate-dev - -npm run dev diff --git a/docker/compose-without-app.yml b/docker/compose-without-app.yml deleted file mode 100644 index e0b566e96..000000000 --- a/docker/compose-without-app.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: documenso -services: - database: - image: postgres:15 - container_name: database - environment: - - POSTGRES_USER=documenso - - POSTGRES_PASSWORD=password - - POSTGRES_DB=documenso - ports: - - 54320:5432 - - inbucket: - image: inbucket/inbucket - container_name: mailserver - ports: - - 9000:9000 - - 2500:2500 - - 1100:1100 diff --git a/docker/compose.yml b/docker/compose.yml deleted file mode 100644 index a48702bf9..000000000 --- a/docker/compose.yml +++ /dev/null @@ -1,40 +0,0 @@ -services: - database: - image: postgres:15 - environment: - - POSTGRES_USER=documenso - - POSTGRES_PASSWORD=password - - POSTGRES_DB=documenso - ports: - - 5432:5432 - - inbucket: - image: inbucket/inbucket - ports: - - 9000:9000 - - 2500:2500 - - 1100:1100 - - documenso: - image: node:18 - working_dir: /app - command: ./docker/compose-entrypoint.sh - depends_on: - - database - - inbucket - environment: - - NEXT_PRIVATE_DATABASE_URL=postgres://documenso:password@database:5432/documenso - - NEXT_PRIVATE_DIRECT_DATABASE_URL=postgres://documenso:password@database:5432/documenso - - NEXT_PUBLIC_WEBAPP_URL=http://localhost:3000 - - NEXTAUTH_SECRET=my-super-secure-secret - - NEXTAUTH_URL=http://localhost:3000 - - SENDGRID_API_KEY= - - SMTP_MAIL_HOST=inbucket - - SMTP_MAIL_PORT=2500 - - SMTP_MAIL_USER=username - - SMTP_MAIL_PASSWORD=password - - MAIL_FROM=admin@example.com - ports: - - 3000:3000 - volumes: - - ../:/app diff --git a/docker/compose-services.yml b/docker/development/compose.yml similarity index 96% rename from docker/compose-services.yml rename to docker/development/compose.yml index 85f06a8d7..15323d981 100644 --- a/docker/compose-services.yml +++ b/docker/development/compose.yml @@ -1,4 +1,5 @@ -name: documenso-services +name: documenso-development + services: database: image: postgres:15 diff --git a/docker/production/compose.yml b/docker/production/compose.yml new file mode 100644 index 000000000..76f613467 --- /dev/null +++ b/docker/production/compose.yml @@ -0,0 +1,63 @@ +name: documenso-production + +services: + database: + image: ?:15 + environment: + - POSTGRES_USER=${POSTGRES_USER:?err} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:?err} + - POSTGRES_DB=${POSTGRES_DB:?err} + healthcheck: + test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER}'] + interval: 10s + timeout: 5s + retries: 5 + volumes: + - database:/var/lib/postgresql/data + + documenso: + image: documenso/documenso:latest + depends_on: + - database + environment: + - PORT=${PORT:-3000} + - NEXTAUTH_URL=${NEXTAUTH_URL:-${NEXT_PUBLIC_WEBAPP_URL}} + - NEXTAUTH_SECRET=${NEXTAUTH_SECRET:?err} + - NEXT_PRIVATE_ENCRYPTION_KEY=${NEXT_PRIVATE_ENCRYPTION_KEY:?err} + - NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY=${NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY:?err} + - NEXT_PRIVATE_GOOGLE_CLIENT_ID=${NEXT_PRIVATE_GOOGLE_CLIENT_ID} + - NEXT_PRIVATE_GOOGLE_CLIENT_SECRET=${NEXT_PRIVATE_GOOGLE_CLIENT_SECRET} + - NEXT_PUBLIC_WEBAPP_URL=${NEXT_PUBLIC_WEBAPP_URL:?err} + - NEXT_PUBLIC_MARKETING_URL=${NEXT_PUBLIC_MARKETING_URL:-https://documenso.com} + - NEXT_PRIVATE_DATABASE_URL=${NEXT_PRIVATE_DATABASE_URL:?err} + - NEXT_PRIVATE_DIRECT_DATABASE_URL=${NEXT_PRIVATE_DIRECT_DATABASE_URL:-${NEXT_PRIVATE_DATABASE_URL}} + - NEXT_PUBLIC_UPLOAD_TRANSPORT=${NEXT_PUBLIC_UPLOAD_TRANSPORT:-database} + - NEXT_PRIVATE_UPLOAD_ENDPOINT=${NEXT_PRIVATE_UPLOAD_ENDPOINT} + - NEXT_PRIVATE_UPLOAD_REGION=${NEXT_PRIVATE_UPLOAD_REGION} + - NEXT_PRIVATE_UPLOAD_BUCKET=${NEXT_PRIVATE_UPLOAD_BUCKET} + - NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID=${NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID} + - NEXT_PRIVATE_UPLOAD_SECRET_ACCESS_KEY=${NEXT_PRIVATE_UPLOAD_SECRET_ACCESS_KEY} + - NEXT_PRIVATE_SMTP_TRANSPORT=${NEXT_PRIVATE_SMTP_TRANSPORT:?err} + - NEXT_PRIVATE_SMTP_HOST=${NEXT_PRIVATE_SMTP_HOST} + - NEXT_PRIVATE_SMTP_PORT=${NEXT_PRIVATE_SMTP_PORT} + - NEXT_PRIVATE_SMTP_USERNAME=${NEXT_PRIVATE_SMTP_USERNAME} + - NEXT_PRIVATE_SMTP_PASSWORD=${NEXT_PRIVATE_SMTP_PASSWORD} + - NEXT_PRIVATE_SMTP_APIKEY_USER=${NEXT_PRIVATE_SMTP_APIKEY_USER} + - NEXT_PRIVATE_SMTP_APIKEY=${NEXT_PRIVATE_SMTP_APIKEY} + - NEXT_PRIVATE_SMTP_SECURE=${NEXT_PRIVATE_SMTP_SECURE} + - NEXT_PRIVATE_SMTP_FROM_NAME=${NEXT_PRIVATE_SMTP_FROM_NAME:?err} + - NEXT_PRIVATE_SMTP_FROM_ADDRESS=${NEXT_PRIVATE_SMTP_FROM_ADDRESS:?err} + - NEXT_PRIVATE_RESEND_API_KEY=${NEXT_PRIVATE_RESEND_API_KEY} + - NEXT_PRIVATE_MAILCHANNELS_API_KEY=${NEXT_PRIVATE_MAILCHANNELS_API_KEY} + - NEXT_PRIVATE_MAILCHANNELS_ENDPOINT=${NEXT_PRIVATE_MAILCHANNELS_ENDPOINT} + - NEXT_PRIVATE_MAILCHANNELS_DKIM_DOMAIN=${NEXT_PRIVATE_MAILCHANNELS_DKIM_DOMAIN} + - NEXT_PRIVATE_MAILCHANNELS_DKIM_SELECTOR=${NEXT_PRIVATE_MAILCHANNELS_DKIM_SELECTOR} + - NEXT_PRIVATE_MAILCHANNELS_DKIM_PRIVATE_KEY=${NEXT_PRIVATE_MAILCHANNELS_DKIM_PRIVATE_KEY} + - NEXT_PUBLIC_DOCUMENT_SIZE_UPLOAD_LIMIT=${NEXT_PUBLIC_DOCUMENT_SIZE_UPLOAD_LIMIT} + - NEXT_PUBLIC_POSTHOG_KEY=${NEXT_PUBLIC_POSTHOG_KEY} + - NEXT_PUBLIC_DISABLE_SIGNUP=${NEXT_PUBLIC_DISABLE_SIGNUP} + ports: + - ${PORT:-3000}:${PORT:-3000} + +volumes: + database: diff --git a/docker/start.sh b/docker/start.sh new file mode 100755 index 000000000..0380835cd --- /dev/null +++ b/docker/start.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +npx prisma migrate deploy --schema ./node_modules/.prisma/client/schema.prisma + +node apps/web/server.js diff --git a/docker/compose-test.yml b/docker/testing/compose.yml similarity index 75% rename from docker/compose-test.yml rename to docker/testing/compose.yml index e401aaf8f..3a1ecd61b 100644 --- a/docker/compose-test.yml +++ b/docker/testing/compose.yml @@ -1,4 +1,5 @@ -name: documenso_test +name: documenso-test + services: database: image: postgres:15 @@ -11,20 +12,20 @@ services: inbucket: image: inbucket/inbucket - # ports: - # - 9000:9000 - # - 2500:2500 - # - 1100:1100 + ports: + - 9000:9000 + - 2500:2500 + - 1100:1100 documenso: build: - context: ../ - dockerfile: docker/Dockerfile + context: ../../ + dockerfile: ../docker/Dockerfile depends_on: - database - inbucket env_file: - - ../.env.example + - ../../.env.example environment: - NEXT_PRIVATE_DATABASE_URL=postgres://documenso:password@database:5432/documenso - NEXT_PRIVATE_DIRECT_DATABASE_URL=postgres://documenso:password@database:5432/documenso diff --git a/package.json b/package.json index 96dc3e9b4..c25aed514 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,8 @@ "clean": "turbo run clean && rimraf node_modules", "d": "npm run dx && npm run dev", "dx": "npm i && npm run dx:up && npm run prisma:migrate-dev", - "dx:up": "docker compose -f docker/compose-services.yml up -d", - "dx:down": "docker compose -f docker/compose-services.yml down", + "dx:up": "docker compose -f docker/development/compose.yml up -d", + "dx:down": "docker compose -f docker/development/compose.yml down", "ci": "turbo run test:e2e", "prisma:generate": "npm run with:env -- npm run prisma:generate -w @documenso/prisma", "prisma:migrate-dev": "npm run with:env -- npm run prisma:migrate-dev -w @documenso/prisma", From 9525b9bd63e580e4e30d9f7a96f35a693eeeb113 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Wed, 6 Mar 2024 23:48:28 +1100 Subject: [PATCH 07/17] fix: resolve issue with testing compose file --- docker/testing/compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/testing/compose.yml b/docker/testing/compose.yml index 3a1ecd61b..b9ba5cda8 100644 --- a/docker/testing/compose.yml +++ b/docker/testing/compose.yml @@ -20,7 +20,7 @@ services: documenso: build: context: ../../ - dockerfile: ../docker/Dockerfile + dockerfile: docker/Dockerfile depends_on: - database - inbucket From 10ef5b6e5159f81b2a60ac5d3ff082221947c5e8 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 7 Mar 2024 02:57:02 +0000 Subject: [PATCH 08/17] fix: improvements from testing --- apps/web/package.json | 6 +++--- docker/Dockerfile | 17 ++++++++++++++--- docker/production/compose.yml | 5 +++-- docker/start.sh | 4 +++- docker/testing/compose.yml | 22 ++++++++++++++++++++-- package-lock.json | 14 +++++++++----- packages/prisma/package.json | 4 ++-- 7 files changed, 54 insertions(+), 18 deletions(-) diff --git a/apps/web/package.json b/apps/web/package.json index efd524992..41caec804 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -19,7 +19,6 @@ "@documenso/ee": "*", "@documenso/lib": "*", "@documenso/prisma": "*", - "@documenso/tailwind-config": "*", "@documenso/trpc": "*", "@documenso/ui": "*", "@hookform/resolvers": "^3.1.0", @@ -46,18 +45,19 @@ "remeda": "^1.27.1", "sharp": "0.33.1", "ts-pattern": "^5.0.5", - "typescript": "5.2.2", "ua-parser-js": "^1.0.37", "uqr": "^0.1.2", "zod": "^3.22.4" }, "devDependencies": { + "@documenso/tailwind-config": "*", "@types/formidable": "^2.0.6", "@types/luxon": "^3.3.1", "@types/node": "20.1.0", "@types/react": "18.2.18", "@types/react-dom": "18.2.7", - "@types/ua-parser-js": "^0.7.39" + "@types/ua-parser-js": "^0.7.39", + "typescript": "5.2.2" }, "overrides": { "next-auth": { diff --git a/docker/Dockerfile b/docker/Dockerfile index 55012df48..0d6f42e1f 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -93,7 +93,18 @@ 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 -# Get the start script from docker/start.sh -COPY --chown=nextjs:nodejs /docker/start.sh . +# Copy the prisma binary, schema and migrations +COPY --from=installer --chown=nextjs:nodejs /app/packages/prisma/schema.prisma ./packages/prisma/schema.prisma +COPY --from=installer --chown=nextjs:nodejs /app/packages/prisma/migrations ./packages/prisma/migrations +COPY --from=installer --chown=nextjs:nodejs /app/node_modules/prisma/ ./node_modules/prisma/ +COPY --from=installer --chown=nextjs:nodejs /app/node_modules/@prisma/ ./node_modules/@prisma/ -CMD start.sh +# Symlink the prisma binary +RUN mkdir node_modules/.bin +RUN ln -s /app/node_modules/prisma/build/index.js ./node_modules/.bin/prisma + + +# Get the start script from docker/start.sh +COPY --chown=nextjs:nodejs ./docker/start.sh ./start.sh + +CMD ["sh", "start.sh"] diff --git a/docker/production/compose.yml b/docker/production/compose.yml index 76f613467..08abcf050 100644 --- a/docker/production/compose.yml +++ b/docker/production/compose.yml @@ -2,7 +2,7 @@ name: documenso-production services: database: - image: ?:15 + image: postgres:15 environment: - POSTGRES_USER=${POSTGRES_USER:?err} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:?err} @@ -18,7 +18,8 @@ services: documenso: image: documenso/documenso:latest depends_on: - - database + database: + condition: service_healthy environment: - PORT=${PORT:-3000} - NEXTAUTH_URL=${NEXTAUTH_URL:-${NEXT_PUBLIC_WEBAPP_URL}} diff --git a/docker/start.sh b/docker/start.sh index 0380835cd..e8d3be2e6 100755 --- a/docker/start.sh +++ b/docker/start.sh @@ -1,5 +1,7 @@ #!/bin/sh -npx prisma migrate deploy --schema ./node_modules/.prisma/client/schema.prisma +set -x + +npx prisma migrate deploy --schema ./packages/prisma/schema.prisma node apps/web/server.js diff --git a/docker/testing/compose.yml b/docker/testing/compose.yml index b9ba5cda8..cecb5bf14 100644 --- a/docker/testing/compose.yml +++ b/docker/testing/compose.yml @@ -7,6 +7,11 @@ services: - POSTGRES_USER=documenso - POSTGRES_PASSWORD=password - POSTGRES_DB=documenso + healthcheck: + test: ['CMD-SHELL', 'pg_isready -U documenso'] + interval: 1s + timeout: 5s + retries: 5 ports: - 54322:5432 @@ -22,12 +27,25 @@ services: context: ../../ dockerfile: docker/Dockerfile depends_on: - - database - - inbucket + database: + condition: service_healthy + inbucket: + condition: service_started env_file: - ../../.env.example environment: + - NEXTAUTH_SECRET=secret + - NEXT_PRIVATE_ENCRYPTION_KEY=CAFEBABE + - NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY=DEADBEEF - NEXT_PRIVATE_DATABASE_URL=postgres://documenso:password@database:5432/documenso - NEXT_PRIVATE_DIRECT_DATABASE_URL=postgres://documenso:password@database:5432/documenso + - NEXT_PUBLIC_UPLOAD_TRANSPORT=database + - NEXT_PRIVATE_SMTP_TRANSPORT=smtp-auth + - NEXT_PRIVATE_SMTP_HOST=inbucket + - NEXT_PRIVATE_SMTP_PORT=2500 + - NEXT_PRIVATE_SMTP_USERNAME=documenso + - NEXT_PRIVATE_SMTP_PASSWORD=password + - NEXT_PRIVATE_SMTP_FROM_NAME="No Reply @ Documenso" + - NEXT_PRIVATE_SMTP_FROM_ADDRESS=noreply@documenso.com ports: - 3000:3000 diff --git a/package-lock.json b/package-lock.json index 27227172c..6096c8df7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -135,7 +135,6 @@ "@documenso/ee": "*", "@documenso/lib": "*", "@documenso/prisma": "*", - "@documenso/tailwind-config": "*", "@documenso/trpc": "*", "@documenso/ui": "*", "@hookform/resolvers": "^3.1.0", @@ -162,18 +161,19 @@ "remeda": "^1.27.1", "sharp": "0.33.1", "ts-pattern": "^5.0.5", - "typescript": "5.2.2", "ua-parser-js": "^1.0.37", "uqr": "^0.1.2", "zod": "^3.22.4" }, "devDependencies": { + "@documenso/tailwind-config": "*", "@types/formidable": "^2.0.6", "@types/luxon": "^3.3.1", "@types/node": "20.1.0", "@types/react": "18.2.18", "@types/react-dom": "18.2.7", - "@types/ua-parser-js": "^0.7.39" + "@types/ua-parser-js": "^0.7.39", + "typescript": "5.2.2" } }, "apps/web/node_modules/@types/node": { @@ -225,6 +225,7 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9700,6 +9701,7 @@ "version": "16.3.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "dev": true, "engines": { "node": ">=12" }, @@ -9711,6 +9713,7 @@ "version": "7.3.0", "resolved": "https://registry.npmjs.org/dotenv-cli/-/dotenv-cli-7.3.0.tgz", "integrity": "sha512-314CA4TyK34YEJ6ntBf80eUY+t1XaFLyem1k9P0sX1gn30qThZ5qZr/ZwE318gEnzyYP9yj9HJk6SqwE0upkfw==", + "dev": true, "dependencies": { "cross-spawn": "^7.0.3", "dotenv": "^16.3.0", @@ -9725,6 +9728,7 @@ "version": "10.0.0", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "dev": true, "engines": { "node": ">=12" } @@ -21419,12 +21423,12 @@ "license": "MIT", "dependencies": { "@prisma/client": "5.4.2", - "dotenv": "^16.3.1", - "dotenv-cli": "^7.3.0", "prisma": "5.4.2", "ts-pattern": "^5.0.6" }, "devDependencies": { + "dotenv": "^16.3.1", + "dotenv-cli": "^7.3.0", "ts-node": "^10.9.1", "typescript": "5.2.2" } diff --git a/packages/prisma/package.json b/packages/prisma/package.json index 301b51dba..0cd3ed282 100644 --- a/packages/prisma/package.json +++ b/packages/prisma/package.json @@ -19,12 +19,12 @@ }, "dependencies": { "@prisma/client": "5.4.2", - "dotenv": "^16.3.1", - "dotenv-cli": "^7.3.0", "prisma": "5.4.2", "ts-pattern": "^5.0.6" }, "devDependencies": { + "dotenv": "^16.3.1", + "dotenv-cli": "^7.3.0", "ts-node": "^10.9.1", "typescript": "5.2.2" } From f723a344649d9dcf3c3a38d0c30b89e1f9fd5dca Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 7 Mar 2024 14:12:10 +1100 Subject: [PATCH 09/17] chore: remove launch week quote --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index cdb687264..62413a5d3 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -> 🚨 It is Launch Week #2 - Day 1: We launches teams 🎉 https://documen.so/day1 - Documenso Logo

From 8a9588ca6584e993c9f6b4e8baa33a4dc1aca79d Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 7 Mar 2024 03:49:03 +0000 Subject: [PATCH 10/17] fix: fetch tags for publish action --- .github/workflows/publish.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 5792dcb78..3984225ec 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -10,6 +10,8 @@ jobs: steps: - uses: actions/checkout@v4 + with: + fetch-tags: true - name: Set up QEMU uses: docker/setup-qemu-action@v3 From 82efc5f589e534ee985ceb30751d776e46675fe6 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 7 Mar 2024 04:07:55 +0000 Subject: [PATCH 11/17] fix: use docker buildx and push --- .github/workflows/publish.yml | 10 ++-------- docker/buildx-and-push.sh | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 8 deletions(-) create mode 100755 docker/buildx-and-push.sh diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 3984225ec..ed5fb112e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -32,11 +32,5 @@ jobs: username: ${{ github.repository_owner }} password: ${{ secrets.GH_TOKEN }} - - name: Build the docker image - run: ./docker/build.sh - - - name: Push the docker image to DockerHub - run: docker push --all-tags documenso/documenso - - - name: Push the docker image to GitHub Container Registry - run: docker push --all-tags ghcr.io/documenso/documenso + - name: Build and push the docker image + run: ./docker/buildx-and-push.sh diff --git a/docker/buildx-and-push.sh b/docker/buildx-and-push.sh new file mode 100755 index 000000000..3fd0fb3d4 --- /dev/null +++ b/docker/buildx-and-push.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +command -v docker >/dev/null 2>&1 || { + echo "Docker is not running. Please start Docker and try again." + exit 1 +} + +SCRIPT_DIR="$(readlink -f "$(dirname "$0")")" +MONOREPO_ROOT="$(readlink -f "$SCRIPT_DIR/../")" + +APP_VERSION="$(git name-rev --tags --name-only $(git rev-parse HEAD) | head -n 1 | sed 's/\^0//')" +GIT_SHA="$(git rev-parse HEAD)" + +echo "Building docker image for monorepo at $MONOREPO_ROOT" +echo "App version: $APP_VERSION" +echo "Git SHA: $GIT_SHA" + +docker buildx build \ + -f "$SCRIPT_DIR/Dockerfile" \ + --platformlinux/amd64,linux/arm64 \ + --progress=plain \ + -t "documenso/documenso:latest" \ + -t "documenso/documenso:$GIT_SHA" \ + -t "documenso/documenso:$APP_VERSION" \ + -t "ghcr.io/documenso/documenso:latest" \ + -t "ghcr.io/documenso/documenso:$GIT_SHA" \ + -t "ghcr.io/documenso/documenso:$APP_VERSION" \ + --push \ + "$MONOREPO_ROOT" From 03d2a2a278dd94033c8e17b9184f5620571f3dcd Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 7 Mar 2024 04:35:25 +0000 Subject: [PATCH 12/17] fix: update buildx platform arg --- docker/buildx-and-push.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/buildx-and-push.sh b/docker/buildx-and-push.sh index 3fd0fb3d4..889fe93ec 100755 --- a/docker/buildx-and-push.sh +++ b/docker/buildx-and-push.sh @@ -17,7 +17,7 @@ echo "Git SHA: $GIT_SHA" docker buildx build \ -f "$SCRIPT_DIR/Dockerfile" \ - --platformlinux/amd64,linux/arm64 \ + --platform=linux/amd64,linux/arm64 \ --progress=plain \ -t "documenso/documenso:latest" \ -t "documenso/documenso:$GIT_SHA" \ From b9b57f16c04315ae77a33070d3f7fcc265451d75 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 7 Mar 2024 05:05:35 +0000 Subject: [PATCH 13/17] fix: use matrix build --- .github/workflows/publish.yml | 10 ++++++++++ docker/buildx-and-push.sh | 8 +++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index ed5fb112e..f1bc73c36 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -7,6 +7,14 @@ on: jobs: build: runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + platform: + - linux/amd64 + - linux/arm/v6 + - linux/arm/v7 + - linux/arm64 steps: - uses: actions/checkout@v4 @@ -34,3 +42,5 @@ jobs: - name: Build and push the docker image run: ./docker/buildx-and-push.sh + env: + PLATFORM: ${{ matrix.platform }} diff --git a/docker/buildx-and-push.sh b/docker/buildx-and-push.sh index 889fe93ec..9665a8aa5 100755 --- a/docker/buildx-and-push.sh +++ b/docker/buildx-and-push.sh @@ -8,6 +8,12 @@ command -v docker >/dev/null 2>&1 || { SCRIPT_DIR="$(readlink -f "$(dirname "$0")")" MONOREPO_ROOT="$(readlink -f "$SCRIPT_DIR/../")" +# Get the platform from environment variable or set to linux/amd64 if not set +# quote the string to prevent word splitting +if [ -z "$PLATFORM" ]; then + PLATFORM="linux/amd64" +fi + APP_VERSION="$(git name-rev --tags --name-only $(git rev-parse HEAD) | head -n 1 | sed 's/\^0//')" GIT_SHA="$(git rev-parse HEAD)" @@ -17,7 +23,7 @@ echo "Git SHA: $GIT_SHA" docker buildx build \ -f "$SCRIPT_DIR/Dockerfile" \ - --platform=linux/amd64,linux/arm64 \ + --platform=$PLATFORM \ --progress=plain \ -t "documenso/documenso:latest" \ -t "documenso/documenso:$GIT_SHA" \ From cffb7907b57b4b9f43beb94ab46201fe6b9a4e22 Mon Sep 17 00:00:00 2001 From: Mythie Date: Thu, 7 Mar 2024 18:30:22 +1100 Subject: [PATCH 14/17] chore: remove bcrypt --- docker/buildx.sh | 8 +- package-lock.json | 354 ++++++++++++++++-- packages/lib/next-auth/auth-options.ts | 2 +- packages/lib/package.json | 3 +- packages/lib/server-only/2fa/disable-2fa.ts | 2 +- packages/lib/server-only/2fa/setup-2fa.ts | 2 +- packages/lib/server-only/auth/hash.ts | 2 +- packages/lib/server-only/user/create-user.ts | 2 +- .../lib/server-only/user/reset-password.ts | 2 +- .../lib/server-only/user/update-password.ts | 2 +- 10 files changed, 332 insertions(+), 47 deletions(-) diff --git a/docker/buildx.sh b/docker/buildx.sh index cdfdf69e4..c5442107d 100755 --- a/docker/buildx.sh +++ b/docker/buildx.sh @@ -8,6 +8,12 @@ command -v docker >/dev/null 2>&1 || { SCRIPT_DIR="$(readlink -f "$(dirname "$0")")" MONOREPO_ROOT="$(readlink -f "$SCRIPT_DIR/../")" +# Get the platform from environment variable or set to linux/amd64 if not set +# quote the string to prevent word splitting +if [ -z "$PLATFORM" ]; then + PLATFORM="linux/amd64" +fi + APP_VERSION="$(git name-rev --tags --name-only $(git rev-parse HEAD) | head -n 1 | sed 's/\^0//')" GIT_SHA="$(git rev-parse HEAD)" @@ -17,7 +23,7 @@ echo "Git SHA: $GIT_SHA" docker buildx build \ -f "$SCRIPT_DIR/Dockerfile" \ - --platform linux/amd64,linux/arm64 \ + --platform=$PLATFORM \ --progress=plain \ -t "documenso/documenso:latest" \ -t "documenso/documenso:$GIT_SHA" \ diff --git a/package-lock.json b/package-lock.json index 6096c8df7..72d06b98a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2008,6 +2008,15 @@ "resolved": "https://registry.npmjs.org/@effect-ts/system/-/system-0.57.5.tgz", "integrity": "sha512-/crHGujo0xnuHIYNc1VgP0HGJGFSoSqq88JFXe6FmFyXPpWt8Xu39LyLg7rchsxfXFeEdA9CrIZvLV5eswXV5g==" }, + "node_modules/@emnapi/core": { + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-0.45.0.tgz", + "integrity": "sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@emnapi/runtime": { "version": "0.44.0", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-0.44.0.tgz", @@ -2971,6 +2980,7 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "optional": true, "dependencies": { "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", @@ -2990,6 +3000,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "optional": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -3009,6 +3020,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "optional": true, "dependencies": { "glob": "^7.1.3" }, @@ -3064,6 +3076,26 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.1.1.tgz", + "integrity": "sha512-ATj9ua659JgrkICjJscaeZdmPr44cb/KFjNWuD0N6pux0SpzaM7+iOuuK11mAnQM2N9q0DT4REu6NkL8ZEhopw==", + "optional": true, + "dependencies": { + "@emnapi/core": "^0.45.0", + "@emnapi/runtime": "^0.45.0", + "@tybys/wasm-util": "^0.8.1" + } + }, + "node_modules/@napi-rs/wasm-runtime/node_modules/@emnapi/runtime": { + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-0.45.0.tgz", + "integrity": "sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@next-auth/prisma-adapter": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@next-auth/prisma-adapter/-/prisma-adapter-1.0.7.tgz", @@ -3240,6 +3272,244 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@node-rs/bcrypt": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt/-/bcrypt-1.10.0.tgz", + "integrity": "sha512-RMa5qSq5mueYhyQvonUqDjRM5NUdDF3aTQwxvAYNythUhAspYm/k1G+3RIpQIyN7BJDra/JMgmjY2t6gx2n6CQ==", + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@node-rs/bcrypt-android-arm-eabi": "1.10.0", + "@node-rs/bcrypt-android-arm64": "1.10.0", + "@node-rs/bcrypt-darwin-arm64": "1.10.0", + "@node-rs/bcrypt-darwin-x64": "1.10.0", + "@node-rs/bcrypt-freebsd-x64": "1.10.0", + "@node-rs/bcrypt-linux-arm-gnueabihf": "1.10.0", + "@node-rs/bcrypt-linux-arm64-gnu": "1.10.0", + "@node-rs/bcrypt-linux-arm64-musl": "1.10.0", + "@node-rs/bcrypt-linux-x64-gnu": "1.10.0", + "@node-rs/bcrypt-linux-x64-musl": "1.10.0", + "@node-rs/bcrypt-wasm32-wasi": "1.10.0", + "@node-rs/bcrypt-win32-arm64-msvc": "1.10.0", + "@node-rs/bcrypt-win32-ia32-msvc": "1.10.0", + "@node-rs/bcrypt-win32-x64-msvc": "1.10.0" + } + }, + "node_modules/@node-rs/bcrypt-android-arm-eabi": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-android-arm-eabi/-/bcrypt-android-arm-eabi-1.10.0.tgz", + "integrity": "sha512-rQ+LPDYg4FG6xs2pB5/e+RgbUudXyoLNaOwCmnW+GDzCrFxoZeypaqlDiQq3XfeFSmL1FLbrtgXm67kplGLJ7Q==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-android-arm64": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-android-arm64/-/bcrypt-android-arm64-1.10.0.tgz", + "integrity": "sha512-OCKtivGEtqoljZuxmWvQ4i7x68T5A/MZZWqiqYLJONjpnpCLuqlyJ/UbVW28Xkw2kCAARYwVoHKBODacFfHS4w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-darwin-arm64": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-darwin-arm64/-/bcrypt-darwin-arm64-1.10.0.tgz", + "integrity": "sha512-ryi/FOlQu9KUSAsuUPLA6FacluOGomU/9A/k4o+4AR2dOjfjZMrkcGa4ioZf8aCZU0Ed6zZ/iPNcxPL8DEyRZQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-darwin-x64": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-darwin-x64/-/bcrypt-darwin-x64-1.10.0.tgz", + "integrity": "sha512-EMrdK7Ghyc+DwEXYvnJ0lRSSZGoTaOCnST53ySR9Zsan4VfSZw26PEXJ2hk3Bzj2/95N8kwvzaJtMLTqee44Ag==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-freebsd-x64": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-freebsd-x64/-/bcrypt-freebsd-x64-1.10.0.tgz", + "integrity": "sha512-UjT1+zBhMmq0yxnWjdgVwq4OXwJtaOvVgpziAJEmYwq0AY/+n/FkYd+kViEAfO9ZSJMfzGubiJMOn/jWsMSFJw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-linux-arm-gnueabihf": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm-gnueabihf/-/bcrypt-linux-arm-gnueabihf-1.10.0.tgz", + "integrity": "sha512-NuScKpkORnakT7IMidPcqQadgFQpHbcg6nMU4oyN6i1RGx66hbLheP/YD+2O2y/H98q9MGTn5DJ7czCE6h2QGA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-linux-arm64-gnu": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm64-gnu/-/bcrypt-linux-arm64-gnu-1.10.0.tgz", + "integrity": "sha512-U8lWREyHYU4jI58CYZVA+/NIVWRMPfgRz1OxvrZw5SnKW4LUvS9UxIkcw5TGoUlA5XXv46qU4MceO/PHd1XV0A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-linux-arm64-musl": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm64-musl/-/bcrypt-linux-arm64-musl-1.10.0.tgz", + "integrity": "sha512-2Sc7NNlpuwHB/L2WvqhkQr8UOs1w4MT1xgXLoaumYhBj6GnnjryUlvHao1uuid5Yj/PteIyBXgpi8wmdU+68xA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-linux-x64-gnu": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-x64-gnu/-/bcrypt-linux-x64-gnu-1.10.0.tgz", + "integrity": "sha512-dqzl/Sxiqc8cGNhIOiO12r0s7P0CVruoY1Dkz4OyTMujn4mOuu9r0+8sdX7kudZMHPzOruYFlFQw3o9+Tb3jzw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-linux-x64-musl": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-x64-musl/-/bcrypt-linux-x64-musl-1.10.0.tgz", + "integrity": "sha512-3IXdIUKnuphbEouCMh0RuQ7vutxj2ti2vyEI+iaK7oVON8pKUf+veCzPSffaxU7uj4yKBElY4rv18PRK4cbgSQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-wasm32-wasi": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-wasm32-wasi/-/bcrypt-wasm32-wasi-1.10.0.tgz", + "integrity": "sha512-zqpKu9eFdrVUSV+FZc0z+1p/i00/ovDwQY3c54sCdmV3U72LzsXUGXhnJoPYxq/Z6ea+wn+GIrCEKDlV0vy2dA==", + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@node-rs/bcrypt-win32-arm64-msvc": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-arm64-msvc/-/bcrypt-win32-arm64-msvc-1.10.0.tgz", + "integrity": "sha512-DzTfWehvN1q4cRPMHHdbR7A2jDYR+P/uhNCkVsopNhdt+UojEQxLV6gp0Ane+m9bfya9jazWr1Vb4QL1KS25cA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-win32-ia32-msvc": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-ia32-msvc/-/bcrypt-win32-ia32-msvc-1.10.0.tgz", + "integrity": "sha512-mlV090RTewQRodje7I9ezKjMVQCW5FU5U+wVFnGUNYDDC2Iwuqb5rvyYpQ/yUbK1+nMtYlNcK7b5aAR+nL7zzA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-win32-x64-msvc": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-x64-msvc/-/bcrypt-win32-x64-msvc-1.10.0.tgz", + "integrity": "sha512-PxWRi8o+YLTGCANUlNJzUb7qDQz/uCffTcWPlwnJhyXpSC48cCQjCC7EHC9X248NTMz3hUBC9tHVKhrSg2IY9Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -6951,6 +7221,15 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "devOptional": true }, + "node_modules/@tybys/wasm-util": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.8.1.tgz", + "integrity": "sha512-GSsTwyBl4pIzsxAY5wroZdyQKyhXk0d8PCRZtrSZ2WEB1cBdrp2EgGBwHOGCZtIIPun/DL3+AykCv+J6fyRH4Q==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/acorn": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", @@ -6959,15 +7238,6 @@ "@types/estree": "*" } }, - "node_modules/@types/bcrypt": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.2.tgz", - "integrity": "sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/d3-array": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", @@ -7433,7 +7703,8 @@ "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "optional": true }, "node_modules/acorn": { "version": "8.11.2", @@ -7496,6 +7767,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, "dependencies": { "debug": "4" }, @@ -7588,12 +7860,14 @@ "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "optional": true }, "node_modules/are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "optional": true, "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -7949,19 +8223,6 @@ } ] }, - "node_modules/bcrypt": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", - "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", - "hasInstallScript": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.11", - "node-addon-api": "^5.0.0" - }, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/before-after-hook": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", @@ -8383,6 +8644,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "optional": true, "engines": { "node": ">=10" } @@ -8833,6 +9095,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "optional": true, "bin": { "color-support": "bin.js" } @@ -8971,7 +9234,8 @@ "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "optional": true }, "node_modules/content-type": { "version": "1.0.4", @@ -9473,7 +9737,8 @@ "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "optional": true }, "node_modules/depd": { "version": "1.1.2", @@ -11449,6 +11714,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "optional": true, "dependencies": { "minipass": "^3.0.0" }, @@ -11460,6 +11726,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -11563,6 +11830,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "optional": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.2", @@ -11581,12 +11849,14 @@ "node_modules/gauge/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "optional": true }, "node_modules/gauge/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "optional": true, "engines": { "node": ">=8" } @@ -11595,6 +11865,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "optional": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -11952,7 +12223,8 @@ "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "optional": true }, "node_modules/hash-wasm": { "version": "4.11.0", @@ -12251,6 +12523,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "optional": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -13829,6 +14102,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "optional": true, "dependencies": { "semver": "^6.0.0" }, @@ -13843,6 +14117,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "optional": true, "bin": { "semver": "bin/semver.js" } @@ -14886,6 +15161,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "optional": true, "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -14898,6 +15174,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -14909,6 +15186,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "optional": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -15208,11 +15486,6 @@ "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" }, - "node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" - }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -15313,6 +15586,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, "dependencies": { "abbrev": "1" }, @@ -15369,6 +15643,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "optional": true, "dependencies": { "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", @@ -18233,7 +18508,8 @@ "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "optional": true }, "node_modules/set-function-length": { "version": "1.1.1", @@ -19262,6 +19538,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "optional": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -20673,6 +20950,7 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "optional": true, "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } @@ -20680,12 +20958,14 @@ "node_modules/wide-align/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "optional": true }, "node_modules/wide-align/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "optional": true, "engines": { "node": ">=8" } @@ -20694,6 +20974,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "optional": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -21365,12 +21646,12 @@ "@next-auth/prisma-adapter": "1.0.7", "@noble/ciphers": "0.4.0", "@noble/hashes": "1.3.2", + "@node-rs/bcrypt": "^1.10.0", "@pdf-lib/fontkit": "^1.1.1", "@scure/base": "^1.1.3", "@sindresorhus/slugify": "^2.2.1", "@upstash/redis": "^1.20.6", "@vvo/tzdb": "^6.117.0", - "bcrypt": "^5.1.0", "luxon": "^3.4.0", "nanoid": "^4.0.2", "next": "14.0.3", @@ -21384,7 +21665,6 @@ "zod": "^3.22.4" }, "devDependencies": { - "@types/bcrypt": "^5.0.0", "@types/luxon": "^3.3.1" } }, diff --git a/packages/lib/next-auth/auth-options.ts b/packages/lib/next-auth/auth-options.ts index 4a394c0a3..74a712576 100644 --- a/packages/lib/next-auth/auth-options.ts +++ b/packages/lib/next-auth/auth-options.ts @@ -1,6 +1,6 @@ /// import { PrismaAdapter } from '@next-auth/prisma-adapter'; -import { compare } from 'bcrypt'; +import { compare } from '@node-rs/bcrypt'; import { DateTime } from 'luxon'; import type { AuthOptions, Session, User } from 'next-auth'; import type { JWT } from 'next-auth/jwt'; diff --git a/packages/lib/package.json b/packages/lib/package.json index 3fd14864e..7a32b3058 100644 --- a/packages/lib/package.json +++ b/packages/lib/package.json @@ -32,7 +32,7 @@ "@sindresorhus/slugify": "^2.2.1", "@upstash/redis": "^1.20.6", "@vvo/tzdb": "^6.117.0", - "bcrypt": "^5.1.0", + "@node-rs/bcrypt": "^1.10.0", "luxon": "^3.4.0", "nanoid": "^4.0.2", "next": "14.0.3", @@ -46,7 +46,6 @@ "zod": "^3.22.4" }, "devDependencies": { - "@types/bcrypt": "^5.0.0", "@types/luxon": "^3.3.1" } } diff --git a/packages/lib/server-only/2fa/disable-2fa.ts b/packages/lib/server-only/2fa/disable-2fa.ts index dd8a180c9..aba763d2d 100644 --- a/packages/lib/server-only/2fa/disable-2fa.ts +++ b/packages/lib/server-only/2fa/disable-2fa.ts @@ -1,4 +1,4 @@ -import { compare } from 'bcrypt'; +import { compare } from '@node-rs/bcrypt'; import { prisma } from '@documenso/prisma'; import type { User } from '@documenso/prisma/client'; diff --git a/packages/lib/server-only/2fa/setup-2fa.ts b/packages/lib/server-only/2fa/setup-2fa.ts index bcaa8d498..e94676121 100644 --- a/packages/lib/server-only/2fa/setup-2fa.ts +++ b/packages/lib/server-only/2fa/setup-2fa.ts @@ -1,5 +1,5 @@ +import { compare } from '@node-rs/bcrypt'; import { base32 } from '@scure/base'; -import { compare } from 'bcrypt'; import crypto from 'crypto'; import { createTOTPKeyURI } from 'oslo/otp'; diff --git a/packages/lib/server-only/auth/hash.ts b/packages/lib/server-only/auth/hash.ts index bb0b760fe..d38d344da 100644 --- a/packages/lib/server-only/auth/hash.ts +++ b/packages/lib/server-only/auth/hash.ts @@ -1,4 +1,4 @@ -import { compareSync as bcryptCompareSync, hashSync as bcryptHashSync } from 'bcrypt'; +import { compareSync as bcryptCompareSync, hashSync as bcryptHashSync } from '@node-rs/bcrypt'; import crypto from 'crypto'; import { SALT_ROUNDS } from '../../constants/auth'; diff --git a/packages/lib/server-only/user/create-user.ts b/packages/lib/server-only/user/create-user.ts index dbcec9efb..263fa9392 100644 --- a/packages/lib/server-only/user/create-user.ts +++ b/packages/lib/server-only/user/create-user.ts @@ -1,4 +1,4 @@ -import { hash } from 'bcrypt'; +import { hash } from '@node-rs/bcrypt'; import { getStripeCustomerByUser } from '@documenso/ee/server-only/stripe/get-customer'; import { updateSubscriptionItemQuantity } from '@documenso/ee/server-only/stripe/update-subscription-item-quantity'; diff --git a/packages/lib/server-only/user/reset-password.ts b/packages/lib/server-only/user/reset-password.ts index 39aac5d28..457d7e28c 100644 --- a/packages/lib/server-only/user/reset-password.ts +++ b/packages/lib/server-only/user/reset-password.ts @@ -1,4 +1,4 @@ -import { compare, hash } from 'bcrypt'; +import { compare, hash } from '@node-rs/bcrypt'; import { prisma } from '@documenso/prisma'; import { UserSecurityAuditLogType } from '@documenso/prisma/client'; diff --git a/packages/lib/server-only/user/update-password.ts b/packages/lib/server-only/user/update-password.ts index 2621fe8e3..9c4882c5a 100644 --- a/packages/lib/server-only/user/update-password.ts +++ b/packages/lib/server-only/user/update-password.ts @@ -1,4 +1,4 @@ -import { compare, hash } from 'bcrypt'; +import { compare, hash } from '@node-rs/bcrypt'; import { SALT_ROUNDS } from '@documenso/lib/constants/auth'; import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; From 8dad3607cf1e6f8a071864f173ec9202ce97380d Mon Sep 17 00:00:00 2001 From: Mythie Date: Thu, 7 Mar 2024 18:48:06 +1100 Subject: [PATCH 15/17] fix: add @node-rs/bcrypt to server component externals --- apps/marketing/next.config.js | 1 + apps/web/next.config.js | 1 + 2 files changed, 2 insertions(+) diff --git a/apps/marketing/next.config.js b/apps/marketing/next.config.js index 9c61e4ada..0a0032868 100644 --- a/apps/marketing/next.config.js +++ b/apps/marketing/next.config.js @@ -21,6 +21,7 @@ const FONT_CAVEAT_BYTES = fs.readFileSync( const config = { experimental: { outputFileTracingRoot: path.join(__dirname, '../../'), + serverComponentsExternalPackages: ['@node-rs/bcrypt'], serverActions: { bodySizeLimit: '50mb', }, diff --git a/apps/web/next.config.js b/apps/web/next.config.js index 7a42cb46a..1a48e29e3 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -22,6 +22,7 @@ const config = { output: process.env.DOCKER_OUTPUT ? 'standalone' : undefined, experimental: { outputFileTracingRoot: path.join(__dirname, '../../'), + serverComponentsExternalPackages: ['@node-rs/bcrypt'], serverActions: { bodySizeLimit: '50mb', }, From 35b2405921ebd1a539382bcb395e8fb4f887daa1 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 7 Mar 2024 10:02:33 +0000 Subject: [PATCH 16/17] chore: use warpbuild for docker publishing --- .github/workflows/publish.yml | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f1bc73c36..862f248fe 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -6,27 +6,19 @@ on: jobs: build: - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: - platform: - - linux/amd64 - - linux/arm/v6 - - linux/arm/v7 - - linux/arm64 + os: + - warp-ubuntu-latest-x64-4x + - warp-ubuntu-latest-arm64-4x steps: - uses: actions/checkout@v4 with: fetch-tags: true - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Login to DockerHub uses: docker/login-action@v3 with: @@ -40,7 +32,11 @@ jobs: username: ${{ github.repository_owner }} password: ${{ secrets.GH_TOKEN }} - - name: Build and push the docker image - run: ./docker/buildx-and-push.sh - env: - PLATFORM: ${{ matrix.platform }} + - name: Build the docker image + run: ./docker/build.sh + + - name: Push the docker image to DockerHub + run: docker push --all-tags documenso/documenso + + - name: Push the docker image to GitHub Container Registry + run: docker push --all-tags ghcr.io/documenso/documenso From f6eddaa9f62875dd2ea28382c5e7f62a7a1e92ed Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 7 Mar 2024 18:17:28 +0800 Subject: [PATCH 17/17] fix: remove duplicate neon pooler (#990) ## Description Fixes the issue with Vercel preview deployments failing. It appears that the old `PGHOST` environment variable injected by neon was: `ep-snowy-snowflake-a2vc5pa2.eu-central-1.aws.neon.tech` It is now: `ep-snowy-snowflake-a2vc5pa2.eu-central-1-pooler.aws.neon.tech` Notice the `-pooler` being attached automatically to the `PGHOST`. ## References > The following changes were made to the [Neon Vercel Integration](https://vercel.com/integrations/neon): > >To ensure that users accessing a Neon database from a serverless environment have enough connections, the DATABASE_URL and PGHOST environment variables added to a Vercel project by the Neon integration are now set to a pooled Neon connection string by default. Pooled connections support up to 10,000 simultaneous connections. Previously, these variables were set to an unpooled connection string supporting fewer concurrent connections. https://neon.tech/docs/changelog https://neon.tech/docs/guides/vercel#manage-vercel-environment-variables --- packages/prisma/helper.ts | 17 ++++------------- packages/prisma/seed-database.ts | 8 +++++++- scripts/vercel.sh | 17 +++++++---------- turbo.json | 1 + 4 files changed, 19 insertions(+), 24 deletions(-) diff --git a/packages/prisma/helper.ts b/packages/prisma/helper.ts index 3acd113fc..512f7cd55 100644 --- a/packages/prisma/helper.ts +++ b/packages/prisma/helper.ts @@ -15,6 +15,10 @@ export const getDatabaseUrl = () => { process.env.NEXT_PRIVATE_DIRECT_DATABASE_URL = process.env.DATABASE_URL; } + if (process.env.DATABASE_URL_UNPOOLED) { + process.env.NEXT_PRIVATE_DIRECT_DATABASE_URL = process.env.DATABASE_URL_UNPOOLED; + } + if (process.env.POSTGRES_PRISMA_URL) { process.env.NEXT_PRIVATE_DATABASE_URL = process.env.POSTGRES_PRISMA_URL; } @@ -40,18 +44,5 @@ export const getDatabaseUrl = () => { process.env.NEXT_PRIVATE_DATABASE_URL = url.toString().replace('https://', 'postgres://'); } - // Support for neon.tech (Neon Database) - if (url.hostname.endsWith('neon.tech')) { - const [projectId, ...rest] = url.hostname.split('.'); - - if (!projectId.endsWith('-pooler')) { - url.hostname = `${projectId}-pooler.${rest.join('.')}`; - } - - url.searchParams.set('pgbouncer', 'true'); - - process.env.NEXT_PRIVATE_DATABASE_URL = url.toString().replace('https://', 'postgres://'); - } - return process.env.NEXT_PRIVATE_DATABASE_URL; }; diff --git a/packages/prisma/seed-database.ts b/packages/prisma/seed-database.ts index e9db2a30c..c2bdde60e 100644 --- a/packages/prisma/seed-database.ts +++ b/packages/prisma/seed-database.ts @@ -13,7 +13,13 @@ const seedDatabase = async () => { if ('seedDatabase' in mod && typeof mod.seedDatabase === 'function') { console.log(`[SEEDING]: ${file}`); - await mod.seedDatabase(); + + try { + await mod.seedDatabase(); + } catch (e) { + console.log(`[SEEDING]: Seed failed for ${file}`); + console.error(e); + } } } } diff --git a/scripts/vercel.sh b/scripts/vercel.sh index 30fe99476..4be594f4e 100755 --- a/scripts/vercel.sh +++ b/scripts/vercel.sh @@ -6,7 +6,6 @@ set -eo pipefail # Get the directory of this script, regardless of where it is called from. SCRIPT_DIR="$(readlink -f "$(dirname "$0")")" - function log() { echo "[VercelBuild]: $1" } @@ -69,19 +68,17 @@ function remap_database_integration() { export NEXT_PRIVATE_DIRECT_DATABASE_URL="$DATABASE_URL" fi + if [[ ! -z "$DATABASE_URL_UNPOOLED" ]]; then + log "Remapping for Neon integration" + + export NEXT_PRIVATE_DATABASE_URL="$DATABASE_URL&pgbouncer=true" + export NEXT_PRIVATE_DIRECT_DATABASE_URL="$DATABASE_URL_UNPOOLED" + fi + if [[ ! -z "$POSTGRES_URL_NON_POOLING" ]]; then export NEXT_PRIVATE_DATABASE_URL="$POSTGRES_URL?pgbouncer=true" export NEXT_PRIVATE_DIRECT_DATABASE_URL="$POSTGRES_URL_NON_POOLING" fi - - if [[ "$NEXT_PRIVATE_DATABASE_URL" == *"neon.tech"* ]]; then - log "Remapping for Neon integration" - - PROJECT_ID="$(echo "$PGHOST" | cut -d'.' -f1)" - PGBOUNCER_HOST="$(echo "$PGHOST" | sed "s/${PROJECT_ID}/${PROJECT_ID}-pooler/")" - - export NEXT_PRIVATE_DATABASE_URL="postgres://${PGUSER}:${PGPASSWORD}@${PGBOUNCER_HOST}/${PGDATABASE}?pgbouncer=true" - fi } # Navigate to the root of the project. diff --git a/turbo.json b/turbo.json index 995ed43e5..5e2c5526c 100644 --- a/turbo.json +++ b/turbo.json @@ -90,6 +90,7 @@ "FONT_CAVEAT_URI", "POSTGRES_URL", "DATABASE_URL", + "DATABASE_URL_UNPOOLED", "POSTGRES_PRISMA_URL", "POSTGRES_URL_NON_POOLING", "E2E_TEST_AUTHENTICATE_USERNAME",