Compare commits

..

7 Commits

Author SHA1 Message Date
Ephraim Atta-Duncan
05197993fa Revert changes to pdf.worker.min.js to match main branch 2024-05-29 15:21:32 +00:00
Ephraim Atta-Duncan
04cd5b58c2 fix: pdf worker changes 2024-05-29 15:19:49 +00:00
Ephraim Atta-Duncan
f7e9d1b3cb fix: revert changes on pdf worker 2024-05-29 15:16:58 +00:00
Ephraim Atta-Duncan
ca077dd3a6 fix: restore pdf worker changes 2024-05-29 15:02:35 +00:00
Ephraim Atta-Duncan
8e9287a7c1 fix: update health check endpoint 2024-05-29 13:45:53 +00:00
Ephraim Atta-Duncan
93e816a5b4 fix: update start command 2024-05-29 13:08:05 +00:00
Ephraim Atta-Duncan
d3734ff344 fix: add new environmental variables for render deployment 2024-05-29 11:27:58 +00:00
16 changed files with 94 additions and 150 deletions

View File

@@ -116,6 +116,3 @@ E2E_TEST_AUTHENTICATE_USER_PASSWORD="test_Password123"
# [[REDIS]]
NEXT_PRIVATE_REDIS_URL=
NEXT_PRIVATE_REDIS_TOKEN=
# [[Telemetry]]
DISABLE_TELEMETRY=false

File diff suppressed because one or more lines are too long

View File

@@ -28,7 +28,6 @@ const config = {
experimental: {
outputFileTracingRoot: path.join(__dirname, '../../'),
serverComponentsExternalPackages: ['@node-rs/bcrypt', '@documenso/pdf-sign', 'playwright'],
instrumentationHook: true,
serverActions: {
bodySizeLimit: '50mb',
},

View File

@@ -1,13 +1,12 @@
import { getSiteSettings } from '@documenso/lib/server-only/site-settings/get-site-settings';
import {
SITE_SETTINGS_BANNER_ID,
ZSiteSettingsBannerSchema,
} from '@documenso/lib/server-only/site-settings/schemas/banner';
import { SITE_SETTINGS_BANNER_ID } from '@documenso/lib/server-only/site-settings/schemas/banner';
import { SettingsHeader } from '~/components/(dashboard)/settings/layout/header';
import { BannerForm } from './banner-form';
// import { BannerForm } from './banner-form';
export default async function AdminBannerPage() {
const banner = await getSiteSettings().then((settings) =>
settings.find((setting) => setting.id === SITE_SETTINGS_BANNER_ID),
@@ -18,7 +17,7 @@ export default async function AdminBannerPage() {
<SettingsHeader title="Site Settings" subtitle="Manage your site settings here" />
<div className="mt-8">
<BannerForm banner={ZSiteSettingsBannerSchema.parse(banner)} />
<BannerForm banner={banner} />
</div>
</div>
);

View File

@@ -1,11 +1,10 @@
import { getSiteSettings } from '@documenso/lib/server-only/site-settings/get-site-settings';
import type { TSiteSettingSchema } from '@documenso/lib/server-only/site-settings/schema';
import { SITE_SETTINGS_BANNER_ID } from '@documenso/lib/server-only/site-settings/schemas/banner';
export const Banner = async () => {
const banner = (await getSiteSettings().then((settings) =>
const banner = await getSiteSettings().then((settings) =>
settings.find((setting) => setting.id === SITE_SETTINGS_BANNER_ID),
)) as Extract<TSiteSettingSchema, { id: 'site.banner' }>;
);
return (
<>
@@ -24,3 +23,7 @@ export const Banner = async () => {
</>
);
};
// Banner
// Custom Text
// Custom Text with Custom Icon

View File

@@ -1,6 +1,6 @@
import { useEffect, useState } from 'react';
import { WebhookTriggerEvents } from '@prisma/client';
import { WebhookTriggerEvents } from '@prisma/client/';
import { Check, ChevronsUpDown } from 'lucide-react';
import { toFriendlyWebhookEventName } from '@documenso/lib/universal/webhook/to-friendly-webhook-event-name';

View File

@@ -1,9 +0,0 @@
import { registerInstance } from '@documenso/lib/server-only/telemetry/register-instance';
import packageInfo from '../package.json';
export const register = async () => {
if (process.env.NEXT_RUNTIME === 'nodejs') {
await registerInstance({ version: packageInfo.version });
}
};

View File

@@ -1,12 +1,9 @@
import { z } from 'zod';
import { ZSiteSettingsBannerSchema } from './schemas/banner';
import { ZSiteSettingsTelemetrySchema } from './schemas/telemetry';
export const ZSiteSettingSchema = z.union([
ZSiteSettingsBannerSchema,
ZSiteSettingsTelemetrySchema,
]);
// TODO: Use `z.union([...])` once we have more than one setting
export const ZSiteSettingSchema = ZSiteSettingsBannerSchema;
export type TSiteSettingSchema = z.infer<typeof ZSiteSettingSchema>;

View File

@@ -1,20 +0,0 @@
import { nanoid } from 'nanoid';
import { z } from 'zod';
import { ZSiteSettingsBaseSchema } from './_base';
export const SITE_SETTINGS_TELEMETRY_ID = 'site.instance-id';
export const ZSiteSettingsTelemetrySchema = ZSiteSettingsBaseSchema.extend({
id: z.literal(SITE_SETTINGS_TELEMETRY_ID),
data: z
.object({
instanceId: z.string(),
})
.optional()
.default({
instanceId: nanoid(),
}),
});
export type TSiteSettingsTelemetrySchema = z.infer<typeof ZSiteSettingsTelemetrySchema>;

View File

@@ -3,7 +3,7 @@ import { prisma } from '@documenso/prisma';
import type { TSiteSettingSchema } from './schema';
export type UpsertSiteSettingOptions = TSiteSettingSchema & {
userId: number | null;
userId: number;
};
export const upsertSiteSetting = async ({

View File

@@ -1,46 +0,0 @@
import { nanoid } from 'nanoid';
import { getSiteSettings } from '../site-settings/get-site-settings';
import {
SITE_SETTINGS_TELEMETRY_ID,
ZSiteSettingsTelemetrySchema,
} from '../site-settings/schemas/telemetry';
import { upsertSiteSetting } from '../site-settings/upsert-site-setting';
import { sendInstance } from './send-instance';
type RegisterInstanceOptions = {
version: string;
};
export const registerInstance = async ({ version }: RegisterInstanceOptions) => {
const instanceResponse = await getSiteSettings().then((settings) =>
settings.find((setting) => setting.id === SITE_SETTINGS_TELEMETRY_ID),
);
const instance = ZSiteSettingsTelemetrySchema.parse(instanceResponse);
if (!instance) {
const upsert = await upsertSiteSetting({
data: {
instanceId: nanoid(),
},
enabled: true,
id: SITE_SETTINGS_TELEMETRY_ID,
userId: null,
});
const instance = ZSiteSettingsTelemetrySchema.parse(upsert);
return await sendInstance({
uniqueId: instance.data?.instanceId,
timestamp: new Date(),
version,
});
}
return await sendInstance({
uniqueId: instance.data.instanceId,
timestamp: new Date(),
version,
});
};

View File

@@ -1,38 +0,0 @@
export type SendInstance = {
uniqueId: string;
timestamp: Date;
version: string;
};
export const sendInstance = async ({ uniqueId, timestamp, version }: SendInstance) => {
const isProduction = process.env.NODE_ENV === 'production';
const isTelemetryDisabled = process.env.DISABLE_TELEMETRY === 'true';
if (!isProduction || isTelemetryDisabled) {
return;
}
const url = 'https://documenso-instances.fly.dev/ping';
try {
const response = await fetch(url, {
method: 'POST',
body: JSON.stringify({
uniqueId: String(uniqueId),
timestamp: new Date(timestamp).toISOString(),
version,
}),
headers: {
'Content-Type': 'application/json',
},
});
if (!response.ok) {
throw new Error(`Failed to record instance, failed with status code ${response.status}`);
}
return await response.json();
} catch (error) {
console.error(error);
}
};

View File

@@ -1,7 +1,7 @@
import { Role } from '@prisma/client';
import z from 'zod';
import { ZSiteSettingsBannerSchema } from '@documenso/lib/server-only/site-settings/schemas/banner';
import { ZSiteSettingSchema } from '@documenso/lib/server-only/site-settings/schema';
export const ZAdminFindDocumentsQuerySchema = z.object({
term: z.string().optional(),
@@ -30,7 +30,7 @@ export type TAdminUpdateRecipientMutationSchema = z.infer<
typeof ZAdminUpdateRecipientMutationSchema
>;
export const ZAdminUpdateSiteSettingMutationSchema = ZSiteSettingsBannerSchema;
export const ZAdminUpdateSiteSettingMutationSchema = ZSiteSettingSchema;
export type TAdminUpdateSiteSettingMutationSchema = z.infer<
typeof ZAdminUpdateSiteSettingMutationSchema

View File

@@ -70,7 +70,6 @@ declare namespace NodeJS {
VERCEL?: string;
VERCEL_ENV?: 'production' | 'development' | 'preview';
VERCEL_URL?: string;
NEXT_RUNTIME?: 'nodejs' | 'edge';
DEPLOYMENT_TARGET?: 'webapp' | 'marketing';
FONT_CAVEAT_URI: string;
@@ -80,7 +79,5 @@ declare namespace NodeJS {
DATABASE_URL?: string;
POSTGRES_PRISMA_URL?: string;
POSTGRES_URL_NON_POOLING?: string;
DISABLE_TELEMETRY?: string;
}
}

View File

@@ -1,11 +1,11 @@
services:
- type: web
runtime: node
name: documenso-app
env: node
plan: free
buildCommand: npm i && npm run build:web
startCommand: npx prisma migrate deploy --schema packages/prisma/schema.prisma && npm run start
healthCheckPath: /api/trpc/health
startCommand: npx prisma migrate deploy --schema packages/prisma/schema.prisma && npx turbo run start --filter=@documenso/web
healthCheckPath: /api/health
envVars:
# Node Version
@@ -98,6 +98,62 @@ services:
- key: NEXT_PRIVATE_UPLOAD_SECRET_ACCESS_KEY
sync: false
# Crypto
- key: NEXT_PRIVATE_ENCRYPTION_KEY
generateValue: true
- key: NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY
generateValue: true
# Auth Optional
- key: NEXT_PRIVATE_GOOGLE_CLIENT_ID
sync: false
- key: NEXT_PRIVATE_GOOGLE_CLIENT_SECRET
sync: false
# Signing
- key: NEXT_PRIVATE_SIGNING_TRANSPORT
sync: false
- key: NEXT_PRIVATE_SIGNING_PASSPHRASE
sync: false
- key: NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATH
sync: false
- key: NEXT_PRIVATE_SIGNING_LOCAL_FILE_CONTENTS
sync: false
- key: NEXT_PRIVATE_SIGNING_GCLOUD_HSM_KEY_PATH
sync: false
- key: NEXT_PRIVATE_SIGNING_GCLOUD_HSM_PUBLIC_CRT_FILE_PATH
sync: false
- key: NEXT_PRIVATE_SIGNING_GCLOUD_HSM_PUBLIC_CRT_FILE_CONTENTS
sync: false
- key: NEXT_PRIVATE_SIGNING_GCLOUD_APPLICATION_CREDENTIALS_CONTENTS
sync: false
# SMTP Optional
- key: NEXT_PRIVATE_SMTP_APIKEY_USER
sync: false
- key: NEXT_PRIVATE_SMTP_APIKEY
sync: false
- key: NEXT_PRIVATE_SMTP_SECURE
sync: false
- key: NEXT_PRIVATE_RESEND_API_KEY
sync: false
- key: NEXT_PRIVATE_MAILCHANNELS_API_KEY
sync: false
- key: NEXT_PRIVATE_MAILCHANNELS_ENDPOINT
sync: false
- key: NEXT_PRIVATE_MAILCHANNELS_DKIM_DOMAIN
sync: false
- key: NEXT_PRIVATE_MAILCHANNELS_DKIM_SELECTOR
sync: false
- key: NEXT_PRIVATE_MAILCHANNELS_DKIM_PRIVATE_KEY
sync: false
- key: NEXT_PUBLIC_DOCUMENT_SIZE_UPLOAD_LIMIT
sync: false
# Features Optional
- key: NEXT_PUBLIC_DISABLE_SIGNUP
sync: false
databases:
- name: documenso-db
plan: free

View File

@@ -2,8 +2,13 @@
"$schema": "https://turbo.build/schema.json",
"pipeline": {
"build": {
"dependsOn": ["^build"],
"outputs": [".next/**", "!.next/cache/**"]
"dependsOn": [
"^build"
],
"outputs": [
".next/**",
"!.next/cache/**"
]
},
"lint": {
"cache": false
@@ -19,7 +24,9 @@
"persistent": true
},
"start": {
"dependsOn": ["^build"],
"dependsOn": [
"^build"
],
"cache": false,
"persistent": true
},
@@ -27,11 +34,15 @@
"cache": false
},
"test:e2e": {
"dependsOn": ["^build"],
"dependsOn": [
"^build"
],
"cache": false
}
},
"globalDependencies": ["**/.env.*local"],
"globalDependencies": [
"**/.env.*local"
],
"globalEnv": [
"APP_VERSION",
"NEXT_PRIVATE_ENCRYPTION_KEY",
@@ -110,8 +121,6 @@
"GOOGLE_APPLICATION_CREDENTIALS",
"E2E_TEST_AUTHENTICATE_USERNAME",
"E2E_TEST_AUTHENTICATE_USER_EMAIL",
"E2E_TEST_AUTHENTICATE_USER_PASSWORD",
"DISABLE_TELEMETRY",
"NEXT_RUNTIME"
"E2E_TEST_AUTHENTICATE_USER_PASSWORD"
]
}
}