From 03bfc55fed982ab5749f3a9913bf05b662654ed3 Mon Sep 17 00:00:00 2001 From: okxlin <61420215+okxlin@users.noreply.github.com> Date: Fri, 21 Aug 2026 11:29:47 +0800 Subject: [PATCH] Update documenso app Rebuilt-from-PR: #6028 Source-PR: https://github.com/okxlin/appstore/pull/6028 Maintainer-workflow: appstore-pr-maintainer --- apps/documenso/2.16.0/data.yml | 379 ----------------- apps/documenso/2.16.0/docker-compose.yml | 58 --- apps/documenso/{2.16.0 => 2.17.0}/.env.sample | 18 +- apps/documenso/2.17.0/data.yml | 393 ++++++++++++++++++ .../{2.16.0 => 2.17.0}/data/.gitkeep | 0 .../{latest => 2.17.0}/docker-compose.yml | 2 +- .../{2.16.0 => 2.17.0}/scripts/init.sh | 0 .../{2.16.0 => 2.17.0}/scripts/uninstall.sh | 0 .../{2.16.0 => 2.17.0}/scripts/upgrade.sh | 0 apps/documenso/data.yml | 24 +- apps/documenso/latest/.env.sample | 23 - apps/documenso/latest/data.yml | 379 ----------------- apps/documenso/latest/data/.gitkeep | 0 apps/documenso/latest/scripts/init.sh | 152 ------- apps/documenso/latest/scripts/uninstall.sh | 2 - apps/documenso/latest/scripts/upgrade.sh | 4 - apps/documenso/logo.png | Bin 8200 -> 5773 bytes 17 files changed, 411 insertions(+), 1023 deletions(-) delete mode 100644 apps/documenso/2.16.0/data.yml delete mode 100644 apps/documenso/2.16.0/docker-compose.yml rename apps/documenso/{2.16.0 => 2.17.0}/.env.sample (72%) create mode 100644 apps/documenso/2.17.0/data.yml rename apps/documenso/{2.16.0 => 2.17.0}/data/.gitkeep (100%) rename apps/documenso/{latest => 2.17.0}/docker-compose.yml (95%) rename apps/documenso/{2.16.0 => 2.17.0}/scripts/init.sh (100%) rename apps/documenso/{2.16.0 => 2.17.0}/scripts/uninstall.sh (100%) rename apps/documenso/{2.16.0 => 2.17.0}/scripts/upgrade.sh (100%) delete mode 100644 apps/documenso/latest/.env.sample delete mode 100644 apps/documenso/latest/data.yml delete mode 100644 apps/documenso/latest/data/.gitkeep delete mode 100755 apps/documenso/latest/scripts/init.sh delete mode 100755 apps/documenso/latest/scripts/uninstall.sh delete mode 100755 apps/documenso/latest/scripts/upgrade.sh diff --git a/apps/documenso/2.16.0/data.yml b/apps/documenso/2.16.0/data.yml deleted file mode 100644 index 6ac564976..000000000 --- a/apps/documenso/2.16.0/data.yml +++ /dev/null @@ -1,379 +0,0 @@ -additionalProperties: - formFields: - - default: 127.0.0.1 - edit: true - envKey: PANEL_APP_BIND_ADDRESS - labelEn: Bind Address - labelZh: 绑定地址 - label: - en: Bind Address - zh: 绑定地址 - zh-Hant: 綁定位址 - ja: バインドアドレス - ko: 바인드 주소 - ru: Адрес привязки - ms: Alamat ikatan - pt-br: Endereco de vinculacao - required: true - type: text - - default: 3000 - edit: true - envKey: PANEL_APP_PORT_HTTP - labelEn: HTTP Port - labelZh: HTTP 端口 - label: - en: HTTP Port - zh: HTTP 端口 - zh-Hant: HTTP 連接埠 - ja: HTTP ポート - ko: HTTP 포트 - ru: HTTP-порт - ms: Port HTTP - pt-br: Porta HTTP - required: true - rule: paramPort - type: number - - default: http://127.0.0.1:3000 - edit: true - envKey: NEXT_PUBLIC_WEBAPP_URL - labelEn: Public URL - labelZh: 公开访问地址 - label: - en: Public URL - zh: 公开访问地址 - zh-Hant: 公開存取網址 - ja: 公開 URL - ko: 공개 URL - ru: Публичный URL - ms: URL awam - pt-br: URL publica - required: true - type: text - - default: postgresql - envKey: PANEL_DB_TYPE - labelEn: Database Runtime - labelZh: 数据库运行环境 - label: - en: Database Runtime - zh: 数据库运行环境 - zh-Hant: 資料庫執行環境 - ja: データベース実行環境 - ko: 데이터베이스 런타임 - ru: Среда базы данных - ms: Masa jalan pangkalan data - pt-br: Ambiente de banco de dados - required: true - type: apps - values: - - label: PostgreSQL - value: postgresql - child: - default: "" - envKey: PANEL_DB_HOST - labelEn: PostgreSQL Service - labelZh: PostgreSQL 服务 - label: - en: PostgreSQL Service - zh: PostgreSQL 服务 - zh-Hant: PostgreSQL 服務 - ja: PostgreSQL サービス - ko: PostgreSQL 서비스 - ru: Сервис PostgreSQL - ms: Perkhidmatan PostgreSQL - pt-br: Servico PostgreSQL - required: true - type: service - - default: 5432 - edit: true - envKey: PANEL_DB_PORT - labelEn: Database Port - labelZh: 数据库端口 - label: - en: Database Port - zh: 数据库端口 - zh-Hant: 資料庫連接埠 - ja: データベースポート - ko: 데이터베이스 포트 - ru: Порт базы данных - ms: Port pangkalan data - pt-br: Porta do banco de dados - required: true - rule: paramPort - type: number - - default: documenso - edit: true - envKey: PANEL_DB_NAME - labelEn: Database Name - labelZh: 数据库名称 - label: - en: Database Name - zh: 数据库名称 - zh-Hant: 資料庫名稱 - ja: データベース名 - ko: 데이터베이스 이름 - ru: Имя базы данных - ms: Nama pangkalan data - pt-br: Nome do banco de dados - random: true - required: true - rule: paramCommon - type: text - - default: documenso - edit: true - envKey: PANEL_DB_USER - labelEn: Database User - labelZh: 数据库用户 - label: - en: Database User - zh: 数据库用户 - zh-Hant: 資料庫使用者 - ja: データベースユーザー - ko: 데이터베이스 사용자 - ru: Пользователь базы данных - ms: Pengguna pangkalan data - pt-br: Usuario do banco de dados - random: true - required: true - rule: paramCommon - type: text - - default: change-me - edit: true - envKey: PANEL_DB_USER_PASSWORD - labelEn: Database Password - labelZh: 数据库密码 - label: - en: Database Password - zh: 数据库密码 - zh-Hant: 資料庫密碼 - ja: データベースパスワード - ko: 데이터베이스 비밀번호 - ru: Пароль базы данных - ms: Kata laluan pangkalan data - pt-br: Senha do banco de dados - required: true - rule: paramComplexity - type: password - - default: smtp.example.com - edit: true - envKey: SMTP_HOST - labelEn: SMTP Host - labelZh: SMTP 主机 - label: - en: SMTP Host - zh: SMTP 主机 - zh-Hant: SMTP 主機 - ja: SMTP ホスト - ko: SMTP 호스트 - ru: SMTP-сервер - ms: Hos SMTP - pt-br: Servidor SMTP - required: true - type: text - - default: 587 - edit: true - envKey: SMTP_PORT - labelEn: SMTP Port - labelZh: SMTP 端口 - label: - en: SMTP Port - zh: SMTP 端口 - zh-Hant: SMTP 連接埠 - ja: SMTP ポート - ko: SMTP 포트 - ru: SMTP-порт - ms: Port SMTP - pt-br: Porta SMTP - required: true - rule: paramPort - type: number - - default: "false" - edit: true - envKey: SMTP_SECURE - labelEn: SMTP Implicit TLS - labelZh: SMTP 隐式 TLS - label: - en: SMTP Implicit TLS - zh: SMTP 隐式 TLS - zh-Hant: SMTP 隱式 TLS - ja: SMTP 暗黙 TLS - ko: SMTP 암시적 TLS - ru: Неявный TLS SMTP - ms: TLS tersirat SMTP - pt-br: TLS implicito SMTP - required: true - type: select - values: - - label: "false" - value: "false" - - label: "true" - value: "true" - - default: "" - edit: true - envKey: SMTP_USERNAME - labelEn: SMTP Username - labelZh: SMTP 用户名 - label: - en: SMTP Username - zh: SMTP 用户名 - zh-Hant: SMTP 使用者名稱 - ja: SMTP ユーザー名 - ko: SMTP 사용자 이름 - ru: Имя пользователя SMTP - ms: Nama pengguna SMTP - pt-br: Usuario SMTP - required: false - type: text - - default: "" - edit: true - envKey: SMTP_PASSWORD - labelEn: SMTP Password - labelZh: SMTP 密码 - label: - en: SMTP Password - zh: SMTP 密码 - zh-Hant: SMTP 密碼 - ja: SMTP パスワード - ko: SMTP 비밀번호 - ru: Пароль SMTP - ms: Kata laluan SMTP - pt-br: Senha SMTP - required: false - type: password - - default: Documenso - edit: true - envKey: SMTP_FROM_NAME - labelEn: Email Sender Name - labelZh: 邮件发件人名称 - label: - en: Email Sender Name - zh: 邮件发件人名称 - zh-Hant: 郵件寄件者名稱 - ja: メール送信者名 - ko: 이메일 발신자 이름 - ru: Имя отправителя - ms: Nama penghantar e-mel - pt-br: Nome do remetente - required: true - type: text - - default: documenso@example.com - edit: true - envKey: SMTP_FROM_ADDRESS - labelEn: Email Sender Address - labelZh: 邮件发件人地址 - label: - en: Email Sender Address - zh: 邮件发件人地址 - zh-Hant: 郵件寄件者地址 - ja: メール送信元アドレス - ko: 이메일 발신자 주소 - ru: Адрес отправителя - ms: Alamat penghantar e-mel - pt-br: Endereco do remetente - required: true - type: text - - default: "false" - edit: true - envKey: DISABLE_SIGNUP - labelEn: Disable New Signups - labelZh: 禁止新用户注册 - label: - en: Disable New Signups - zh: 禁止新用户注册 - zh-Hant: 停用新使用者註冊 - ja: 新規登録を無効化 - ko: 신규 가입 비활성화 - ru: Запретить новые регистрации - ms: Nyahdayakan pendaftaran baharu - pt-br: Desativar novos cadastros - required: true - type: select - values: - - label: "false" - value: "false" - - label: "true" - value: "true" - - default: generate - disabled: true - edit: true - envKey: NEXTAUTH_SECRET - labelEn: Authentication Secret - labelZh: 认证密钥 - label: - en: Authentication Secret - zh: 认证密钥 - zh-Hant: 驗證密鑰 - ja: 認証シークレット - ko: 인증 비밀 키 - ru: Секрет аутентификации - ms: Rahsia pengesahan - pt-br: Segredo de autenticacao - required: true - type: password - - default: generate - disabled: true - edit: true - envKey: NEXT_PRIVATE_ENCRYPTION_KEY - labelEn: Primary Encryption Key - labelZh: 主加密密钥 - label: - en: Primary Encryption Key - zh: 主加密密钥 - zh-Hant: 主要加密金鑰 - ja: プライマリ暗号化キー - ko: 기본 암호화 키 - ru: Основной ключ шифрования - ms: Kunci penyulitan utama - pt-br: Chave de criptografia primaria - required: true - type: password - - default: generate - disabled: true - edit: true - envKey: NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY - labelEn: Secondary Encryption Key - labelZh: 备用加密密钥 - label: - en: Secondary Encryption Key - zh: 备用加密密钥 - zh-Hant: 備用加密金鑰 - ja: セカンダリ暗号化キー - ko: 보조 암호화 키 - ru: Резервный ключ шифрования - ms: Kunci penyulitan sekunder - pt-br: Chave de criptografia secundaria - required: true - type: password - - default: generate - disabled: true - edit: true - envKey: SIGNING_PASSPHRASE - labelEn: Signing Certificate Passphrase - labelZh: 签名证书密码 - label: - en: Signing Certificate Passphrase - zh: 签名证书密码 - zh-Hant: 簽署憑證密碼 - ja: 署名証明書パスフレーズ - ko: 서명 인증서 암호 - ru: Пароль сертификата подписи - ms: Frasa laluan sijil tandatangan - pt-br: Senha do certificado de assinatura - required: true - type: password - - default: generate - disabled: true - edit: true - envKey: NEXT_PRIVATE_DATABASE_URL - labelEn: Generated Database URL - labelZh: 生成的数据库地址 - label: - en: Generated Database URL - zh: 生成的数据库地址 - zh-Hant: 產生的資料庫網址 - ja: 生成されたデータベース URL - ko: 생성된 데이터베이스 URL - ru: Сформированный URL базы данных - ms: URL pangkalan data dijana - pt-br: URL de banco de dados gerada - required: true - type: password diff --git a/apps/documenso/2.16.0/docker-compose.yml b/apps/documenso/2.16.0/docker-compose.yml deleted file mode 100644 index 421abf79f..000000000 --- a/apps/documenso/2.16.0/docker-compose.yml +++ /dev/null @@ -1,58 +0,0 @@ -services: - documenso: - image: "documenso/documenso:v2.16.0@sha256:945bd2c04306bd5d78def0c4ceafdffb6b0a106cd6a2543db5acda9a6424b2d9" - container_name: ${CONTAINER_NAME} - restart: unless-stopped - command: - - sh - - -c - - ../../node_modules/.bin/prisma migrate deploy --schema ../../packages/prisma/schema.prisma && exec env HOSTNAME=0.0.0.0 node build/server/main.js - networks: - - 1panel-network - ports: - - "${PANEL_APP_BIND_ADDRESS}:${PANEL_APP_PORT_HTTP}:3000" - environment: - PORT: "3000" - NEXTAUTH_SECRET: ${NEXTAUTH_SECRET} - NEXT_PRIVATE_ENCRYPTION_KEY: ${NEXT_PRIVATE_ENCRYPTION_KEY} - NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY: ${NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY} - NEXT_PUBLIC_WEBAPP_URL: ${NEXT_PUBLIC_WEBAPP_URL} - NEXT_PRIVATE_INTERNAL_WEBAPP_URL: http://127.0.0.1:3000 - NEXT_PRIVATE_DATABASE_URL: ${NEXT_PRIVATE_DATABASE_URL} - NEXT_PRIVATE_DIRECT_DATABASE_URL: ${NEXT_PRIVATE_DATABASE_URL} - NEXT_PUBLIC_UPLOAD_TRANSPORT: database - NEXT_PRIVATE_SMTP_TRANSPORT: smtp-auth - NEXT_PRIVATE_SMTP_HOST: ${SMTP_HOST} - NEXT_PRIVATE_SMTP_PORT: ${SMTP_PORT} - NEXT_PRIVATE_SMTP_SECURE: ${SMTP_SECURE} - NEXT_PRIVATE_SMTP_UNSAFE_IGNORE_TLS: "false" - NEXT_PRIVATE_SMTP_USERNAME: ${SMTP_USERNAME} - NEXT_PRIVATE_SMTP_PASSWORD: ${SMTP_PASSWORD} - NEXT_PRIVATE_SMTP_FROM_NAME: ${SMTP_FROM_NAME} - NEXT_PRIVATE_SMTP_FROM_ADDRESS: ${SMTP_FROM_ADDRESS} - NEXT_PRIVATE_SIGNING_TRANSPORT: local - NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATH: /opt/documenso/cert.p12 - NEXT_PRIVATE_SIGNING_PASSPHRASE: ${SIGNING_PASSPHRASE} - NEXT_PUBLIC_DISABLE_SIGNUP: ${DISABLE_SIGNUP} - DOCUMENSO_DISABLE_TELEMETRY: "true" - read_only: true - tmpfs: - - /tmp:size=256m,mode=1777 - security_opt: - - no-new-privileges:true - cap_drop: - - ALL - volumes: - - ./data/cert.p12:/opt/documenso/cert.p12:ro - healthcheck: - test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:3000/api/health').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))"] - interval: 30s - timeout: 10s - start_period: 90s - retries: 5 - labels: - createdBy: "Apps" - -networks: - 1panel-network: - external: true diff --git a/apps/documenso/2.16.0/.env.sample b/apps/documenso/2.17.0/.env.sample similarity index 72% rename from apps/documenso/2.16.0/.env.sample rename to apps/documenso/2.17.0/.env.sample index 285aa5342..ac02944af 100644 --- a/apps/documenso/2.16.0/.env.sample +++ b/apps/documenso/2.17.0/.env.sample @@ -1,18 +1,7 @@ -CONTAINER_NAME=documenso +CONTAINER_NAME=documenso-compose-check PANEL_APP_BIND_ADDRESS=127.0.0.1 PANEL_APP_PORT_HTTP=3000 NEXT_PUBLIC_WEBAPP_URL=http://127.0.0.1:3000 -PANEL_DB_TYPE=postgresql -PANEL_DB_HOST=postgresql -PANEL_DB_PORT=5432 -PANEL_DB_NAME=documenso -PANEL_DB_USER=documenso -PANEL_DB_USER_PASSWORD=change-me -NEXT_PRIVATE_DATABASE_URL=generate -NEXTAUTH_SECRET=generate -NEXT_PRIVATE_ENCRYPTION_KEY=generate -NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY=generate -SIGNING_PASSPHRASE=generate SMTP_HOST=smtp.example.com SMTP_PORT=587 SMTP_SECURE=false @@ -21,3 +10,8 @@ SMTP_PASSWORD= SMTP_FROM_NAME=Documenso SMTP_FROM_ADDRESS=documenso@example.com DISABLE_SIGNUP=false +NEXTAUTH_SECRET=generate +NEXT_PRIVATE_ENCRYPTION_KEY=generate +NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY=generate +SIGNING_PASSPHRASE=generate +NEXT_PRIVATE_DATABASE_URL=generate diff --git a/apps/documenso/2.17.0/data.yml b/apps/documenso/2.17.0/data.yml new file mode 100644 index 000000000..28a804ca5 --- /dev/null +++ b/apps/documenso/2.17.0/data.yml @@ -0,0 +1,393 @@ +additionalProperties: + formFields: + - default: 127.0.0.1 + edit: true + envKey: PANEL_APP_BIND_ADDRESS + labelEn: Bind Address + labelZh: 绑定地址 + label: + en: Bind Address + zh: 绑定地址 + zh-Hant: 綁定位址 + ja: バインドアドレス + ko: 바인드 주소 + ru: Адрес привязки + ms: Alamat ikatan + pt-br: Endereco de vinculacao + required: true + type: text + - default: 3000 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: HTTP Port + labelZh: HTTP 端口 + label: + en: HTTP Port + zh: HTTP 端口 + zh-Hant: HTTP 連接埠 + ja: HTTP ポート + ko: HTTP 포트 + ru: HTTP-порт + ms: Port HTTP + pt-br: Porta HTTP + required: true + rule: paramPort + type: number + - default: http://127.0.0.1:3000 + edit: true + envKey: NEXT_PUBLIC_WEBAPP_URL + labelEn: Public URL + labelZh: 公开访问地址 + label: + en: Public URL + zh: 公开访问地址 + zh-Hant: 公開存取網址 + ja: 公開 URL + ko: 공개 URL + ru: Публичный URL + ms: URL awam + pt-br: URL publica + required: true + type: text + - default: postgresql + envKey: PANEL_DB_TYPE + labelEn: Database Runtime + labelZh: 数据库运行环境 + label: + en: Database Runtime + zh: 数据库运行环境 + zh-Hant: 資料庫執行環境 + ja: データベース実行環境 + ko: 데이터베이스 런타임 + ru: Среда базы данных + ms: Masa jalan pangkalan data + pt-br: Ambiente de banco de dados + required: true + type: apps + values: + - label: PostgreSQL + value: postgresql + child: + default: '' + envKey: PANEL_DB_HOST + labelEn: PostgreSQL Service + labelZh: PostgreSQL 服务 + label: + en: PostgreSQL Service + zh: PostgreSQL 服务 + zh-Hant: PostgreSQL 服務 + ja: PostgreSQL サービス + ko: PostgreSQL 서비스 + ru: Сервис PostgreSQL + ms: Perkhidmatan PostgreSQL + pt-br: Servico PostgreSQL + required: true + type: service + - default: 5432 + edit: false + envKey: PANEL_DB_PORT + labelEn: Database Port + labelZh: 数据库端口 + label: + en: Database Port + zh: 数据库端口 + zh-Hant: 資料庫連接埠 + ja: データベースポート + ko: 데이터베이스 포트 + ru: Порт базы данных + ms: Port pangkalan data + pt-br: Porta do banco de dados + required: true + type: number + - default: documenso + edit: false + envKey: PANEL_DB_NAME + labelEn: Database Name + labelZh: 数据库名称 + label: + en: Database Name + zh: 数据库名称 + zh-Hant: 資料庫名稱 + ja: データベース名 + ko: 데이터베이스 이름 + ru: Имя базы данных + ms: Nama pangkalan data + pt-br: Nome do banco de dados + random: true + required: true + rule: paramCommon + type: text + - default: documenso + edit: false + envKey: PANEL_DB_USER + labelEn: Database User + labelZh: 数据库用户 + label: + en: Database User + zh: 数据库用户 + zh-Hant: 資料庫使用者 + ja: データベースユーザー + ko: 데이터베이스 사용자 + ru: Пользователь базы данных + ms: Pengguna pangkalan data + pt-br: Usuario do banco de dados + random: true + required: true + rule: paramCommon + type: text + - default: change-me + edit: false + envKey: PANEL_DB_USER_PASSWORD + labelEn: Database Password + labelZh: 数据库密码 + label: + en: Database Password + zh: 数据库密码 + zh-Hant: 資料庫密碼 + ja: データベースパスワード + ko: 데이터베이스 비밀번호 + ru: Пароль базы данных + ms: Kata laluan pangkalan data + pt-br: Senha do banco de dados + required: true + rule: paramComplexity + type: password + - default: smtp.example.com + edit: true + envKey: SMTP_HOST + labelEn: SMTP Host + labelZh: SMTP 主机 + label: + en: SMTP Host + zh: SMTP 主机 + zh-Hant: SMTP 主機 + ja: SMTP ホスト + ko: SMTP 호스트 + ru: SMTP-сервер + ms: Hos SMTP + pt-br: Servidor SMTP + required: true + type: text + - default: 587 + edit: true + envKey: SMTP_PORT + labelEn: SMTP Port + labelZh: SMTP 端口 + label: + en: SMTP Port + zh: SMTP 端口 + zh-Hant: SMTP 連接埠 + ja: SMTP ポート + ko: SMTP 포트 + ru: SMTP-порт + ms: Port SMTP + pt-br: Porta SMTP + required: true + type: number + - default: 'false' + edit: true + envKey: SMTP_SECURE + labelEn: SMTP Implicit TLS + labelZh: SMTP 隐式 TLS + label: + en: SMTP Implicit TLS + zh: SMTP 隐式 TLS + zh-Hant: SMTP 隱式 TLS + ja: SMTP 暗黙 TLS + ko: SMTP 암시적 TLS + ru: Неявный TLS SMTP + ms: TLS tersirat SMTP + pt-br: TLS implicito SMTP + required: true + type: select + values: + - label: 'false' + value: 'false' + - label: 'true' + value: 'true' + - default: '' + edit: true + envKey: SMTP_USERNAME + labelEn: SMTP Username + labelZh: SMTP 用户名 + label: + en: SMTP Username + zh: SMTP 用户名 + zh-Hant: SMTP 使用者名稱 + ja: SMTP ユーザー名 + ko: SMTP 사용자 이름 + ru: Имя пользователя SMTP + ms: Nama pengguna SMTP + pt-br: Usuario SMTP + required: false + type: text + - default: '' + edit: true + envKey: SMTP_PASSWORD + labelEn: SMTP Password + labelZh: SMTP 密码 + label: + en: SMTP Password + zh: SMTP 密码 + zh-Hant: SMTP 密碼 + ja: SMTP パスワード + ko: SMTP 비밀번호 + ru: Пароль SMTP + ms: Kata laluan SMTP + pt-br: Senha SMTP + required: false + type: password + - default: Documenso + edit: true + envKey: SMTP_FROM_NAME + labelEn: Email Sender Name + labelZh: 邮件发件人名称 + label: + en: Email Sender Name + zh: 邮件发件人名称 + zh-Hant: 郵件寄件者名稱 + ja: メール送信者名 + ko: 이메일 발신자 이름 + ru: Имя отправителя + ms: Nama penghantar e-mel + pt-br: Nome do remetente + required: true + type: text + - default: documenso@example.com + edit: true + envKey: SMTP_FROM_ADDRESS + labelEn: Email Sender Address + labelZh: 邮件发件人地址 + label: + en: Email Sender Address + zh: 邮件发件人地址 + zh-Hant: 郵件寄件者地址 + ja: メール送信元アドレス + ko: 이메일 발신자 주소 + ru: Адрес отправителя + ms: Alamat penghantar e-mel + pt-br: Endereco do remetente + required: true + type: text + - default: 'false' + edit: true + envKey: DISABLE_SIGNUP + labelEn: Disable New Signups + labelZh: 禁止新用户注册 + label: + en: Disable New Signups + zh: 禁止新用户注册 + zh-Hant: 停用新使用者註冊 + ja: 新規登録を無効化 + ko: 신규 가입 비활성화 + ru: Запретить новые регистрации + ms: Nyahdayakan pendaftaran baharu + pt-br: Desativar novos cadastros + required: true + type: select + values: + - label: 'false' + value: 'false' + - label: 'true' + value: 'true' + - default: generate + disabled: true + edit: true + envKey: NEXTAUTH_SECRET + labelEn: Authentication Secret + labelZh: 认证密钥 + label: + en: Authentication Secret + zh: 认证密钥 + zh-Hant: 驗證密鑰 + ja: 認証シークレット + ko: 인증 비밀 키 + ru: Секрет аутентификации + ms: Rahsia pengesahan + pt-br: Segredo de autenticacao + required: true + type: password + - default: generate + disabled: true + edit: true + envKey: NEXT_PRIVATE_ENCRYPTION_KEY + labelEn: Primary Encryption Key + labelZh: 主加密密钥 + label: + en: Primary Encryption Key + zh: 主加密密钥 + zh-Hant: 主要加密金鑰 + ja: プライマリ暗号化キー + ko: 기본 암호화 키 + ru: Основной ключ шифрования + ms: Kunci penyulitan utama + pt-br: Chave de criptografia primaria + required: true + type: password + - default: generate + disabled: true + edit: true + envKey: NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY + labelEn: Secondary Encryption Key + labelZh: 备用加密密钥 + label: + en: Secondary Encryption Key + zh: 备用加密密钥 + zh-Hant: 備用加密金鑰 + ja: セカンダリ暗号化キー + ko: 보조 암호화 키 + ru: Резервный ключ шифрования + ms: Kunci penyulitan sekunder + pt-br: Chave de criptografia secundaria + required: true + type: password + - default: generate + disabled: true + edit: true + envKey: SIGNING_PASSPHRASE + labelEn: Signing Certificate Passphrase + labelZh: 签名证书密码 + label: + en: Signing Certificate Passphrase + zh: 签名证书密码 + zh-Hant: 簽署憑證密碼 + ja: 署名証明書パスフレーズ + ko: 서명 인증서 암호 + ru: Пароль сертификата подписи + ms: Frasa laluan sijil tandatangan + pt-br: Senha do certificado de assinatura + required: true + type: password + - default: generate + disabled: true + edit: true + envKey: NEXT_PRIVATE_DATABASE_URL + labelEn: Generated Database URL + labelZh: 生成的数据库地址 + label: + en: Generated Database URL + zh: 生成的数据库地址 + zh-Hant: 產生的資料庫網址 + ja: 生成されたデータベース URL + ko: 생성된 데이터베이스 URL + ru: Сформированный URL базы данных + ms: URL pangkalan data dijana + pt-br: URL de banco de dados gerada + required: true + type: password + - default: Asia/Shanghai + edit: true + envKey: TZ + labelEn: Timezone + labelZh: 时区 + label: + en: Timezone + zh: 时区 + zh-Hant: 時區 + ja: タイムゾーン + ko: 시간대 + ru: Часовой пояс + ms: Zon waktu + pt-br: Fuso horário + required: true + type: text diff --git a/apps/documenso/2.16.0/data/.gitkeep b/apps/documenso/2.17.0/data/.gitkeep similarity index 100% rename from apps/documenso/2.16.0/data/.gitkeep rename to apps/documenso/2.17.0/data/.gitkeep diff --git a/apps/documenso/latest/docker-compose.yml b/apps/documenso/2.17.0/docker-compose.yml similarity index 95% rename from apps/documenso/latest/docker-compose.yml rename to apps/documenso/2.17.0/docker-compose.yml index ac4741cce..12e5aff0b 100644 --- a/apps/documenso/latest/docker-compose.yml +++ b/apps/documenso/2.17.0/docker-compose.yml @@ -1,6 +1,6 @@ services: documenso: - image: "documenso/documenso:latest" + image: "documenso/documenso:v2.17.0@sha256:1377ba20181d4d029e768b7b7615e4e49c39450a85588a525e78dc586dd2569c" container_name: ${CONTAINER_NAME} restart: unless-stopped command: diff --git a/apps/documenso/2.16.0/scripts/init.sh b/apps/documenso/2.17.0/scripts/init.sh similarity index 100% rename from apps/documenso/2.16.0/scripts/init.sh rename to apps/documenso/2.17.0/scripts/init.sh diff --git a/apps/documenso/2.16.0/scripts/uninstall.sh b/apps/documenso/2.17.0/scripts/uninstall.sh similarity index 100% rename from apps/documenso/2.16.0/scripts/uninstall.sh rename to apps/documenso/2.17.0/scripts/uninstall.sh diff --git a/apps/documenso/2.16.0/scripts/upgrade.sh b/apps/documenso/2.17.0/scripts/upgrade.sh similarity index 100% rename from apps/documenso/2.16.0/scripts/upgrade.sh rename to apps/documenso/2.17.0/scripts/upgrade.sh diff --git a/apps/documenso/data.yml b/apps/documenso/data.yml index cce9f9674..f910e29ed 100644 --- a/apps/documenso/data.yml +++ b/apps/documenso/data.yml @@ -1,15 +1,24 @@ name: Documenso tags: - - 办公 +- Tool title: 开源文档签署平台 description: 开源文档签署平台 additionalProperties: key: documenso name: Documenso tags: - - Tool + - Tool + type: website + website: https://documenso.com/ + document: https://docs.documenso.com/docs/self-hosting + github: https://github.com/documenso/documenso shortDescZh: 开源文档签署平台 shortDescEn: Open-source document signing platform + crossVersionUpdate: true + limit: 0 + architectures: + - amd64 + - arm64 description: en: Open-source document signing platform zh: 开源文档签署平台 @@ -19,14 +28,3 @@ additionalProperties: ru: Платформа с открытым кодом для подписания документов ms: Platform sumber terbuka untuk menandatangani dokumen pt-br: Plataforma de codigo aberto para assinatura de documentos - type: website - crossVersionUpdate: true - limit: 0 - recommend: 0 - website: https://documenso.com/ - github: https://github.com/documenso/documenso - document: https://docs.documenso.com/docs/self-hosting - memoryRequired: 2048 - architectures: - - amd64 - - arm64 diff --git a/apps/documenso/latest/.env.sample b/apps/documenso/latest/.env.sample deleted file mode 100644 index 285aa5342..000000000 --- a/apps/documenso/latest/.env.sample +++ /dev/null @@ -1,23 +0,0 @@ -CONTAINER_NAME=documenso -PANEL_APP_BIND_ADDRESS=127.0.0.1 -PANEL_APP_PORT_HTTP=3000 -NEXT_PUBLIC_WEBAPP_URL=http://127.0.0.1:3000 -PANEL_DB_TYPE=postgresql -PANEL_DB_HOST=postgresql -PANEL_DB_PORT=5432 -PANEL_DB_NAME=documenso -PANEL_DB_USER=documenso -PANEL_DB_USER_PASSWORD=change-me -NEXT_PRIVATE_DATABASE_URL=generate -NEXTAUTH_SECRET=generate -NEXT_PRIVATE_ENCRYPTION_KEY=generate -NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY=generate -SIGNING_PASSPHRASE=generate -SMTP_HOST=smtp.example.com -SMTP_PORT=587 -SMTP_SECURE=false -SMTP_USERNAME= -SMTP_PASSWORD= -SMTP_FROM_NAME=Documenso -SMTP_FROM_ADDRESS=documenso@example.com -DISABLE_SIGNUP=false diff --git a/apps/documenso/latest/data.yml b/apps/documenso/latest/data.yml deleted file mode 100644 index 6ac564976..000000000 --- a/apps/documenso/latest/data.yml +++ /dev/null @@ -1,379 +0,0 @@ -additionalProperties: - formFields: - - default: 127.0.0.1 - edit: true - envKey: PANEL_APP_BIND_ADDRESS - labelEn: Bind Address - labelZh: 绑定地址 - label: - en: Bind Address - zh: 绑定地址 - zh-Hant: 綁定位址 - ja: バインドアドレス - ko: 바인드 주소 - ru: Адрес привязки - ms: Alamat ikatan - pt-br: Endereco de vinculacao - required: true - type: text - - default: 3000 - edit: true - envKey: PANEL_APP_PORT_HTTP - labelEn: HTTP Port - labelZh: HTTP 端口 - label: - en: HTTP Port - zh: HTTP 端口 - zh-Hant: HTTP 連接埠 - ja: HTTP ポート - ko: HTTP 포트 - ru: HTTP-порт - ms: Port HTTP - pt-br: Porta HTTP - required: true - rule: paramPort - type: number - - default: http://127.0.0.1:3000 - edit: true - envKey: NEXT_PUBLIC_WEBAPP_URL - labelEn: Public URL - labelZh: 公开访问地址 - label: - en: Public URL - zh: 公开访问地址 - zh-Hant: 公開存取網址 - ja: 公開 URL - ko: 공개 URL - ru: Публичный URL - ms: URL awam - pt-br: URL publica - required: true - type: text - - default: postgresql - envKey: PANEL_DB_TYPE - labelEn: Database Runtime - labelZh: 数据库运行环境 - label: - en: Database Runtime - zh: 数据库运行环境 - zh-Hant: 資料庫執行環境 - ja: データベース実行環境 - ko: 데이터베이스 런타임 - ru: Среда базы данных - ms: Masa jalan pangkalan data - pt-br: Ambiente de banco de dados - required: true - type: apps - values: - - label: PostgreSQL - value: postgresql - child: - default: "" - envKey: PANEL_DB_HOST - labelEn: PostgreSQL Service - labelZh: PostgreSQL 服务 - label: - en: PostgreSQL Service - zh: PostgreSQL 服务 - zh-Hant: PostgreSQL 服務 - ja: PostgreSQL サービス - ko: PostgreSQL 서비스 - ru: Сервис PostgreSQL - ms: Perkhidmatan PostgreSQL - pt-br: Servico PostgreSQL - required: true - type: service - - default: 5432 - edit: true - envKey: PANEL_DB_PORT - labelEn: Database Port - labelZh: 数据库端口 - label: - en: Database Port - zh: 数据库端口 - zh-Hant: 資料庫連接埠 - ja: データベースポート - ko: 데이터베이스 포트 - ru: Порт базы данных - ms: Port pangkalan data - pt-br: Porta do banco de dados - required: true - rule: paramPort - type: number - - default: documenso - edit: true - envKey: PANEL_DB_NAME - labelEn: Database Name - labelZh: 数据库名称 - label: - en: Database Name - zh: 数据库名称 - zh-Hant: 資料庫名稱 - ja: データベース名 - ko: 데이터베이스 이름 - ru: Имя базы данных - ms: Nama pangkalan data - pt-br: Nome do banco de dados - random: true - required: true - rule: paramCommon - type: text - - default: documenso - edit: true - envKey: PANEL_DB_USER - labelEn: Database User - labelZh: 数据库用户 - label: - en: Database User - zh: 数据库用户 - zh-Hant: 資料庫使用者 - ja: データベースユーザー - ko: 데이터베이스 사용자 - ru: Пользователь базы данных - ms: Pengguna pangkalan data - pt-br: Usuario do banco de dados - random: true - required: true - rule: paramCommon - type: text - - default: change-me - edit: true - envKey: PANEL_DB_USER_PASSWORD - labelEn: Database Password - labelZh: 数据库密码 - label: - en: Database Password - zh: 数据库密码 - zh-Hant: 資料庫密碼 - ja: データベースパスワード - ko: 데이터베이스 비밀번호 - ru: Пароль базы данных - ms: Kata laluan pangkalan data - pt-br: Senha do banco de dados - required: true - rule: paramComplexity - type: password - - default: smtp.example.com - edit: true - envKey: SMTP_HOST - labelEn: SMTP Host - labelZh: SMTP 主机 - label: - en: SMTP Host - zh: SMTP 主机 - zh-Hant: SMTP 主機 - ja: SMTP ホスト - ko: SMTP 호스트 - ru: SMTP-сервер - ms: Hos SMTP - pt-br: Servidor SMTP - required: true - type: text - - default: 587 - edit: true - envKey: SMTP_PORT - labelEn: SMTP Port - labelZh: SMTP 端口 - label: - en: SMTP Port - zh: SMTP 端口 - zh-Hant: SMTP 連接埠 - ja: SMTP ポート - ko: SMTP 포트 - ru: SMTP-порт - ms: Port SMTP - pt-br: Porta SMTP - required: true - rule: paramPort - type: number - - default: "false" - edit: true - envKey: SMTP_SECURE - labelEn: SMTP Implicit TLS - labelZh: SMTP 隐式 TLS - label: - en: SMTP Implicit TLS - zh: SMTP 隐式 TLS - zh-Hant: SMTP 隱式 TLS - ja: SMTP 暗黙 TLS - ko: SMTP 암시적 TLS - ru: Неявный TLS SMTP - ms: TLS tersirat SMTP - pt-br: TLS implicito SMTP - required: true - type: select - values: - - label: "false" - value: "false" - - label: "true" - value: "true" - - default: "" - edit: true - envKey: SMTP_USERNAME - labelEn: SMTP Username - labelZh: SMTP 用户名 - label: - en: SMTP Username - zh: SMTP 用户名 - zh-Hant: SMTP 使用者名稱 - ja: SMTP ユーザー名 - ko: SMTP 사용자 이름 - ru: Имя пользователя SMTP - ms: Nama pengguna SMTP - pt-br: Usuario SMTP - required: false - type: text - - default: "" - edit: true - envKey: SMTP_PASSWORD - labelEn: SMTP Password - labelZh: SMTP 密码 - label: - en: SMTP Password - zh: SMTP 密码 - zh-Hant: SMTP 密碼 - ja: SMTP パスワード - ko: SMTP 비밀번호 - ru: Пароль SMTP - ms: Kata laluan SMTP - pt-br: Senha SMTP - required: false - type: password - - default: Documenso - edit: true - envKey: SMTP_FROM_NAME - labelEn: Email Sender Name - labelZh: 邮件发件人名称 - label: - en: Email Sender Name - zh: 邮件发件人名称 - zh-Hant: 郵件寄件者名稱 - ja: メール送信者名 - ko: 이메일 발신자 이름 - ru: Имя отправителя - ms: Nama penghantar e-mel - pt-br: Nome do remetente - required: true - type: text - - default: documenso@example.com - edit: true - envKey: SMTP_FROM_ADDRESS - labelEn: Email Sender Address - labelZh: 邮件发件人地址 - label: - en: Email Sender Address - zh: 邮件发件人地址 - zh-Hant: 郵件寄件者地址 - ja: メール送信元アドレス - ko: 이메일 발신자 주소 - ru: Адрес отправителя - ms: Alamat penghantar e-mel - pt-br: Endereco do remetente - required: true - type: text - - default: "false" - edit: true - envKey: DISABLE_SIGNUP - labelEn: Disable New Signups - labelZh: 禁止新用户注册 - label: - en: Disable New Signups - zh: 禁止新用户注册 - zh-Hant: 停用新使用者註冊 - ja: 新規登録を無効化 - ko: 신규 가입 비활성화 - ru: Запретить новые регистрации - ms: Nyahdayakan pendaftaran baharu - pt-br: Desativar novos cadastros - required: true - type: select - values: - - label: "false" - value: "false" - - label: "true" - value: "true" - - default: generate - disabled: true - edit: true - envKey: NEXTAUTH_SECRET - labelEn: Authentication Secret - labelZh: 认证密钥 - label: - en: Authentication Secret - zh: 认证密钥 - zh-Hant: 驗證密鑰 - ja: 認証シークレット - ko: 인증 비밀 키 - ru: Секрет аутентификации - ms: Rahsia pengesahan - pt-br: Segredo de autenticacao - required: true - type: password - - default: generate - disabled: true - edit: true - envKey: NEXT_PRIVATE_ENCRYPTION_KEY - labelEn: Primary Encryption Key - labelZh: 主加密密钥 - label: - en: Primary Encryption Key - zh: 主加密密钥 - zh-Hant: 主要加密金鑰 - ja: プライマリ暗号化キー - ko: 기본 암호화 키 - ru: Основной ключ шифрования - ms: Kunci penyulitan utama - pt-br: Chave de criptografia primaria - required: true - type: password - - default: generate - disabled: true - edit: true - envKey: NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY - labelEn: Secondary Encryption Key - labelZh: 备用加密密钥 - label: - en: Secondary Encryption Key - zh: 备用加密密钥 - zh-Hant: 備用加密金鑰 - ja: セカンダリ暗号化キー - ko: 보조 암호화 키 - ru: Резервный ключ шифрования - ms: Kunci penyulitan sekunder - pt-br: Chave de criptografia secundaria - required: true - type: password - - default: generate - disabled: true - edit: true - envKey: SIGNING_PASSPHRASE - labelEn: Signing Certificate Passphrase - labelZh: 签名证书密码 - label: - en: Signing Certificate Passphrase - zh: 签名证书密码 - zh-Hant: 簽署憑證密碼 - ja: 署名証明書パスフレーズ - ko: 서명 인증서 암호 - ru: Пароль сертификата подписи - ms: Frasa laluan sijil tandatangan - pt-br: Senha do certificado de assinatura - required: true - type: password - - default: generate - disabled: true - edit: true - envKey: NEXT_PRIVATE_DATABASE_URL - labelEn: Generated Database URL - labelZh: 生成的数据库地址 - label: - en: Generated Database URL - zh: 生成的数据库地址 - zh-Hant: 產生的資料庫網址 - ja: 生成されたデータベース URL - ko: 생성된 데이터베이스 URL - ru: Сформированный URL базы данных - ms: URL pangkalan data dijana - pt-br: URL de banco de dados gerada - required: true - type: password diff --git a/apps/documenso/latest/data/.gitkeep b/apps/documenso/latest/data/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/apps/documenso/latest/scripts/init.sh b/apps/documenso/latest/scripts/init.sh deleted file mode 100755 index 0647a5749..000000000 --- a/apps/documenso/latest/scripts/init.sh +++ /dev/null @@ -1,152 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)" -ENV_FILE="${ENV_FILE:-${ROOT_DIR}/.env}" -DATA_DIR="${ROOT_DIR}/data" -CERT_FILE="${DATA_DIR}/cert.p12" - -fail() { - printf '%s\n' "$1" >&2 - exit 1 -} - -read_env_value() { - local key="$1" - local value="" - value="$(sed -n "s/^${key}=//p" "$ENV_FILE" | tail -n 1)" - case "$value" in - \"*\") value="${value#\"}"; value="${value%\"}" ;; - \'*\') value="${value#\'}"; value="${value%\'}" ;; - esac - printf '%s\n' "$value" -} - -set_env_value() { - local key="$1" - local value="$2" - local temp_file - temp_file="$(mktemp "${ROOT_DIR}/.documenso-env.tmp.XXXXXX")" - awk -v key="$key" -v value="$value" ' - BEGIN { written = 0 } - $0 ~ "^" key "=" { - if (!written) { - print key "=" value - written = 1 - } - next - } - { print } - END { if (!written) print key "=" value } - ' "$ENV_FILE" > "$temp_file" - chmod 600 "$temp_file" - mv -f -- "$temp_file" "$ENV_FILE" -} - -generate_secret() { - local key="$1" - local value - value="$(read_env_value "$key")" - if [[ -z "$value" || "$value" == generate ]]; then - value="$(openssl rand -hex 32)" - set_env_value "$key" "$value" - fi - [[ ${#value} -ge 32 ]] || fail "$key must contain at least 32 characters" -} - -urlencode() { - local LC_ALL=C - local input="$1" - local output="" - local character encoded - local index - for ((index = 0; index < ${#input}; index++)); do - character="${input:index:1}" - case "$character" in - [A-Za-z0-9.~_-]) output+="$character" ;; - *) printf -v encoded '%%%02X' "'$character"; output+="$encoded" ;; - esac - done - printf '%s' "$output" -} - -secure_certificate_file() { - local current_uid owner_uid - current_uid="$(id -u)" - if [[ "$current_uid" == 0 ]]; then - chown 1001:65533 -- "$CERT_FILE" - elif [[ "$current_uid" == 1001 ]]; then - owner_uid="$(stat -c %u -- "$CERT_FILE")" - [[ "$owner_uid" == 1001 ]] || fail "the signing certificate must be owned by UID 1001" - [[ -r "$CERT_FILE" ]] || fail "the signing certificate is not readable by UID 1001" - else - fail "init.sh must run as root or UID 1001" - fi - chmod 0400 -- "$CERT_FILE" -} - -[[ -f "$ENV_FILE" ]] || fail "$ENV_FILE not found" -[[ ! -L "$ENV_FILE" ]] || fail "$ENV_FILE must not be a symbolic link" -command -v openssl >/dev/null 2>&1 || fail "openssl is required" - -db_host="$(read_env_value PANEL_DB_HOST)" -db_port="$(read_env_value PANEL_DB_PORT)" -db_name="$(read_env_value PANEL_DB_NAME)" -db_user="$(read_env_value PANEL_DB_USER)" -db_password="$(read_env_value PANEL_DB_USER_PASSWORD)" -[[ "$db_host" =~ ^[A-Za-z0-9][A-Za-z0-9._-]*$ ]] || fail "PANEL_DB_HOST is invalid" -if [[ ! "$db_port" =~ ^[0-9]+$ ]] || ((db_port < 1 || db_port > 65535)); then - fail "PANEL_DB_PORT is invalid" -fi -[[ "$db_name" =~ ^[A-Za-z0-9_][A-Za-z0-9_-]*$ ]] || fail "PANEL_DB_NAME is invalid" -[[ "$db_user" =~ ^[A-Za-z0-9_][A-Za-z0-9_.-]*$ ]] || fail "PANEL_DB_USER is invalid" -[[ -n "$db_password" && "$db_password" != change-me ]] || fail "PANEL_DB_USER_PASSWORD must be configured" - -public_url="$(read_env_value NEXT_PUBLIC_WEBAPP_URL)" -public_url_pattern='^https?://[A-Za-z0-9._~:/?&=%+-]+$' -[[ "$public_url" =~ $public_url_pattern ]] || fail "NEXT_PUBLIC_WEBAPP_URL must be a complete HTTP(S) URL" -smtp_host="$(read_env_value SMTP_HOST)" -smtp_port="$(read_env_value SMTP_PORT)" -smtp_secure="$(read_env_value SMTP_SECURE)" -smtp_from_address="$(read_env_value SMTP_FROM_ADDRESS)" -[[ "$smtp_host" =~ ^[A-Za-z0-9][A-Za-z0-9._-]*$ && "$smtp_host" != smtp.example.com ]] || fail "SMTP_HOST must name a working SMTP service" -if [[ ! "$smtp_port" =~ ^[0-9]+$ ]] || ((smtp_port < 1 || smtp_port > 65535)); then - fail "SMTP_PORT is invalid" -fi -[[ "$smtp_secure" == true || "$smtp_secure" == false ]] || fail "SMTP_SECURE must be true or false" -[[ "$smtp_from_address" =~ ^[^[:space:]@]+@[^[:space:]@]+$ ]] || fail "SMTP_FROM_ADDRESS is invalid" - -chmod 600 "$ENV_FILE" -generate_secret NEXTAUTH_SECRET -generate_secret NEXT_PRIVATE_ENCRYPTION_KEY -generate_secret NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY - -encoded_user="$(urlencode "$db_user")" -encoded_password="$(urlencode "$db_password")" -set_env_value NEXT_PRIVATE_DATABASE_URL "postgresql://${encoded_user}:${encoded_password}@${db_host}:${db_port}/${db_name}" - -install -d -m 0700 "$DATA_DIR" -passphrase="$(read_env_value SIGNING_PASSPHRASE)" -[[ ! -L "$CERT_FILE" ]] || fail "$CERT_FILE must not be a symbolic link" -if [[ -s "$CERT_FILE" ]]; then - [[ -n "$passphrase" && "$passphrase" != generate ]] || fail "SIGNING_PASSPHRASE is missing for the existing certificate" - CERT_PASS="$passphrase" openssl pkcs12 -in "$CERT_FILE" -passin env:CERT_PASS -noout >/dev/null 2>&1 || fail "the existing signing certificate or passphrase is invalid" - secure_certificate_file -else - if [[ -z "$passphrase" || "$passphrase" == generate ]]; then - passphrase="$(openssl rand -hex 32)" - set_env_value SIGNING_PASSPHRASE "$passphrase" - fi - temp_dir="$(mktemp -d "${ROOT_DIR}/.documenso-cert.tmp.XXXXXX")" - trap 'rm -rf -- "$temp_dir"' EXIT - openssl req -new -newkey rsa:3072 -x509 -sha256 -nodes -days 3650 \ - -subj "/CN=Documenso 1Panel Signing" \ - -keyout "${temp_dir}/private.key" -out "${temp_dir}/certificate.crt" >/dev/null 2>&1 - CERT_PASS="$passphrase" openssl pkcs12 -export \ - -inkey "${temp_dir}/private.key" -in "${temp_dir}/certificate.crt" \ - -out "${temp_dir}/cert.p12" -passout env:CERT_PASS - install -m 0400 "${temp_dir}/cert.p12" "$CERT_FILE" - secure_certificate_file - rm -rf -- "$temp_dir" - trap - EXIT -fi diff --git a/apps/documenso/latest/scripts/uninstall.sh b/apps/documenso/latest/scripts/uninstall.sh deleted file mode 100755 index 6e877466e..000000000 --- a/apps/documenso/latest/scripts/uninstall.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail diff --git a/apps/documenso/latest/scripts/upgrade.sh b/apps/documenso/latest/scripts/upgrade.sh deleted file mode 100755 index 692e341e2..000000000 --- a/apps/documenso/latest/scripts/upgrade.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -"$(dirname "$0")/init.sh" diff --git a/apps/documenso/logo.png b/apps/documenso/logo.png index cb4765fcf145b088ec3ad7b1ffe0e16e9db04c4a..7cc4f5547ae65391f5f17db4e2b6a3faf7d366cc 100644 GIT binary patch literal 5773 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 literal 8200 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