From 2cce6dc2e51ebc09c77f0f7029096107669e30f0 Mon Sep 17 00:00:00 2001 From: Mythie Date: Wed, 6 Mar 2024 15:46:51 +1100 Subject: [PATCH 1/3] 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 2/3] 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 3/3] 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" }