diff --git a/.env.example b/.env.example index 877df11bf..420f61daa 100644 --- a/.env.example +++ b/.env.example @@ -7,6 +7,7 @@ # We use dotenv to load Prisma from Next.js' .env file # @see https://www.prisma.io/docs/reference/database-reference/connection-urls DATABASE_URL=postgresql://blobscan:s3cr3t@localhost:5432/blobscan_dev?schema=public +DIRECT_URL=postgresql://blobscan:s3cr3t@localhost:5432/blobscan_dev?schema=public BLOBSCAN_WEB_TAG=next BLOBSCAN_API_TAG=next diff --git a/.env.test b/.env.test index 63efd29af..06ccb7670 100644 --- a/.env.test +++ b/.env.test @@ -1,5 +1,7 @@ COMPOSE_FILE=docker-compose.local.yml DATABASE_URL=postgresql://blobscan:s3cr3t@localhost:5432/blobscan_dev?schema=public +DIRECT_URL=postgresql://blobscan:s3cr3t@localhost:5432/blobscan_dev?schema=public + BLOBSCAN_API_BASE_URL=http://localhost:3001 diff --git a/.github/workflows/changesets.yml b/.github/workflows/changesets.yml index b42035a4e..131cc0a78 100644 --- a/.github/workflows/changesets.yml +++ b/.github/workflows/changesets.yml @@ -11,6 +11,7 @@ concurrency: ${{ github.workflow }}-${{ github.ref }} env: DATABASE_URL: "postgresql://blobscan:s3cr3t@localhost:5432/blobscan_dev?schema=public" + DIRECT_URL: "postgresql://blobscan:s3cr3t@localhost:5432/blobscan_dev?schema=public" jobs: changesets: diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 62e23915b..77f583f59 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -9,6 +9,7 @@ env: TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} TURBO_TEAM: ${{ secrets.TURBO_TEAM }} DATABASE_URL: "postgresql://blobscan:s3cr3t@localhost:5432/blobscan_dev?schema=public" + DIRECT_URL: "postgresql://blobscan:s3cr3t@localhost:5432/blobscan_dev?schema=public" jobs: release_docker: @@ -80,6 +81,7 @@ jobs: BUILD_TIMESTAMP=${{ env.BUILD_TIMESTAMP }} GIT_COMMIT=${{ env.GIT_COMMIT }} DATABASE_URL=${{ env.DATABASE_URL }} + DIRECT_URL=${{ env.DIRECT_URL }} - name: Extract metadata (tags, labels) for Docker (Web) id: meta_web @@ -104,3 +106,4 @@ jobs: BUILD_TIMESTAMP=${{ env.BUILD_TIMESTAMP }} GIT_COMMIT=${{ env.GIT_COMMIT }} DATABASE_URL=${{ env.DATABASE_URL }} + DIRECT_URL=${{ env.DIRECT_URL }} diff --git a/.github/workflows/docker_dev.yml b/.github/workflows/docker_dev.yml index ff7ee8813..2a656375d 100644 --- a/.github/workflows/docker_dev.yml +++ b/.github/workflows/docker_dev.yml @@ -12,6 +12,7 @@ env: TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} TURBO_TEAM: ${{ secrets.TURBO_TEAM }} DATABASE_URL: postgresql://blobscan:s3cr3t@localhost:5432/blobscan_dev?schema=public + DIRECT_URL: postgresql://blobscan:s3cr3t@localhost:5432/blobscan_dev?schema=public jobs: release_docker: @@ -73,6 +74,7 @@ jobs: BUILD_TIMESTAMP=${{ env.BUILD_TIMESTAMP }} GIT_COMMIT=${{ env.GIT_COMMIT }} DATABASE_URL=${{ env.DATABASE_URL }} + DIRECT_URL=${{ env.DIRECT_URL }} - name: Build and push (web) uses: docker/build-push-action@v6.5.0 @@ -86,3 +88,4 @@ jobs: BUILD_TIMESTAMP=${{ env.BUILD_TIMESTAMP }} GIT_COMMIT=${{ env.GIT_COMMIT }} DATABASE_URL=${{ env.DATABASE_URL }} + DIRECT_URL=${{ env.DIRECT_URL }} diff --git a/Dockerfile b/Dockerfile index 4dd0c7120..3c0b02256 100644 --- a/Dockerfile +++ b/Dockerfile @@ -35,6 +35,7 @@ FROM deps AS web-builder WORKDIR /app ARG DATABASE_URL +ARG DIRECT_URL ENV NEXT_BUILD_OUTPUT=standalone ENV NEXT_TELEMETRY_DISABLED=1 @@ -49,7 +50,7 @@ COPY --from=deps /prepare/web/full . # Copy original which includes pipelines COPY --from=deps /prepare/turbo.json . -RUN --mount=type=cache,id=pnpm,target=/pnpm/store DATABASE_URL=${DATABASE_URL} pnpm build --filter=@blobscan/web +RUN --mount=type=cache,id=pnpm,target=/pnpm/store DATABASE_URL=${DATABASE_URL} DIRECT_URL=${DIRECT_URL} pnpm build --filter=@blobscan/web # stage: web FROM base AS web @@ -83,6 +84,8 @@ FROM deps AS api-builder WORKDIR /app ARG DATABASE_URL +ARG DIRECT_URL + COPY --from=deps /prepare/api/json . COPY --from=deps /prepare/api/pnpm-lock.yaml . @@ -94,7 +97,7 @@ COPY --from=deps /prepare/api/full . # Copy original which includes pipelines COPY --from=deps /prepare/turbo.json . -RUN --mount=type=cache,id=pnpm,target=/pnpm/store DATABASE_URL=${DATABASE_URL} pnpm build --filter=@blobscan/rest-api-server +RUN --mount=type=cache,id=pnpm,target=/pnpm/store DATABASE_URL=${DATABASE_URL} DIRECT_URL=${DIRECT_URL} pnpm build --filter=@blobscan/rest-api-server # stage: api FROM base AS api diff --git a/apps/docs/src/app/docs/environment/page.md b/apps/docs/src/app/docs/environment/page.md index 3b8ce03e2..ad9570dfe 100644 --- a/apps/docs/src/app/docs/environment/page.md +++ b/apps/docs/src/app/docs/environment/page.md @@ -11,6 +11,7 @@ nextjs: | Variable | Description | Required | Default value | | -------------------------------------- | ------------------------------------------------------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `DATABASE_URL` | PostgreSQL database URI | Yes | (empty) | +| `DIRECT_URL` | Direct connection to the database used by Prisma CLI for e.g. migrations. | Yes | (empty) | | `FEEDBACK_WEBHOOK_URL` | Discord webhook URL for feedback | No | (empty) | | `PUBLIC_NETWORK_NAME` | Network name | No | mainnet | | `PUBLIC_EXPLORER_BASE_URL` | Block explorer URL | No | `https://etherscan.io` | @@ -33,6 +34,7 @@ nextjs: | ------------------------------------ | -------------------------------------------------------------------------------------------------- | ------------------------------- | ------------------------------ | | `CHAIN_ID` | EVM chain id | Yes | `1` | | `DATABASE_URL` | Postgresql database URI | Yes | (empty) | +| `DIRECT_URL` | Direct connection to the database used by Prisma CLI for e.g. migrations. | Yes | (empty) | | `REDIS_URI` | Redis host | Yes | `redis://localhost:6379/1` | | `SECRET_KEY` | Shared key used for JWT authentication with the indexer | Yes | (empty) | | `NETWORK_NAME` | Network's name (valid values are: `mainnet`, `holesky`, `sepolia`, `gnosis`, `chiado`, `devnet`) | No | `mainnet` | diff --git a/apps/web/src/env.mjs b/apps/web/src/env.mjs index a2dc0eed0..9a1f3fe15 100644 --- a/apps/web/src/env.mjs +++ b/apps/web/src/env.mjs @@ -58,6 +58,7 @@ export const env = createEnv({ */ server: { DATABASE_URL: z.string().url(), + DIRECT_URL: z.string().url(), FEEDBACK_WEBHOOK_URL: z.string().optional(), NODE_ENV: z.enum(["development", "test", "production"]), METRICS_ENABLED: booleanSchema.default("false"), @@ -73,6 +74,7 @@ export const env = createEnv({ */ runtimeEnv: { DATABASE_URL: process.env.DATABASE_URL, + DIRECT_URL: process.env.DIRECT_URL, FEEDBACK_WEBHOOK_URL: process.env.FEEDBACK_WEBHOOK_URL, METRICS_ENABLED: process.env.METRICS_ENABLED, NODE_ENV: process.env.NODE_ENV, diff --git a/scripts/ci/deploy_vercel_env.sh b/scripts/ci/deploy_vercel_env.sh index 15be8e295..14fad8562 100755 --- a/scripts/ci/deploy_vercel_env.sh +++ b/scripts/ci/deploy_vercel_env.sh @@ -1,6 +1,6 @@ #!/bin/bash environment="production" -variables="CHAIN_ID PUBLIC_EXPLORER_BASE_URL PUBLIC_NETWORK_NAME PUBLIC_SUPPORTED_NETWORKS POSTGRES_STORAGE_ENABLED SWARM_STORAGE_ENABLED GOOGLE_STORAGE_ENABLED DATABASE_URL SECRET_KEY" +variables="CHAIN_ID PUBLIC_EXPLORER_BASE_URL PUBLIC_NETWORK_NAME PUBLIC_SUPPORTED_NETWORKS POSTGRES_STORAGE_ENABLED SWARM_STORAGE_ENABLED GOOGLE_STORAGE_ENABLED DATABASE_URL DIRECT_URL SECRET_KEY" # other not so recently updated variables # o_vars="METRICS_ENABLED BEE_ENDPOINT GOOGLE_SERVICE_KEY GOOGLE_STORAGE_BUCKET_NAME GOOGLE_STORAGE_PROJECT_ID" diff --git a/turbo.json b/turbo.json index 3f1afa4e4..7ed93aab9 100644 --- a/turbo.json +++ b/turbo.json @@ -62,6 +62,7 @@ "CHAIN_ID", "CI", "DATABASE_URL", + "DIRECT_URL", "FEEDBACK_WEBHOOK_URL", "FILE_SYSTEM_STORAGE_ENABLED", "FILE_SYSTEM_STORAGE_PATH",