From 405f44c24c50f3e35f6ce0c0f3d596f64ccb7527 Mon Sep 17 00:00:00 2001 From: pooneyy <85266337+pooneyy@users.noreply.github.com> Date: Tue, 27 Jan 2026 00:25:57 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(forgejo):=20update=20configura?= =?UTF-8?q?tion,=20documentation,=20and=20branding=20across=20versions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - reorder and update form fields in data.yml for all versions (14-rootless, 14.0.1-rootless, 14.0.1, 14) - add 'edit: true' property to port fields - update database field labels and add Turkish (tr) translations - change default database username and password values - update docker-compose volumes and ports mapping for all versions - remove obsolete upgrade.sh scripts - rewrite README with detailed product introduction and features - update main data.yml with new description, type, and supported architectures - update application logo --- apps/forgejo/14-rootless/data.yml | 224 +++++++++--------- apps/forgejo/14-rootless/docker-compose.yml | 12 +- apps/forgejo/14-rootless/scripts/upgrade.sh | 11 - apps/forgejo/14.0.1-rootless/data.yml | 224 +++++++++--------- .../14.0.1-rootless/docker-compose.yml | 12 +- .../14.0.1-rootless/scripts/upgrade.sh | 11 - apps/forgejo/14.0.1/data.yml | 224 +++++++++--------- apps/forgejo/14.0.1/docker-compose.yml | 11 +- apps/forgejo/14.0.1/scripts/upgrade.sh | 11 - apps/forgejo/14/data.yml | 224 +++++++++--------- apps/forgejo/14/docker-compose.yml | 11 +- apps/forgejo/14/scripts/upgrade.sh | 11 - apps/forgejo/README.md | 15 +- apps/forgejo/README_en.md | 15 +- apps/forgejo/data.yml | 53 +++-- apps/forgejo/logo.png | Bin 9516 -> 4986 bytes 16 files changed, 526 insertions(+), 543 deletions(-) delete mode 100644 apps/forgejo/14-rootless/scripts/upgrade.sh delete mode 100644 apps/forgejo/14.0.1-rootless/scripts/upgrade.sh delete mode 100644 apps/forgejo/14.0.1/scripts/upgrade.sh delete mode 100644 apps/forgejo/14/scripts/upgrade.sh diff --git a/apps/forgejo/14-rootless/data.yml b/apps/forgejo/14-rootless/data.yml index d91ae5e28..adf1b031a 100644 --- a/apps/forgejo/14-rootless/data.yml +++ b/apps/forgejo/14-rootless/data.yml @@ -1,110 +1,116 @@ additionalProperties: - formFields: - - default: mysql - envKey: PANEL_DB_TYPE - labelEn: Database Service - labelZh: 数据库服务 - required: true - type: apps - child: - default: "" - envKey: PANEL_DB_HOST - required: true - type: service - values: - - label: MySQL - value: mysql - - label: PostgreSQL - value: postgres - label: - en: Database Service - ja: データベースサービス - ms: Perkhidmatan Pangkalan Data - pt-br: Serviço de Banco de Dados - ru: Сервис баз данных - ko: 데이터베이스 서비스 - zh-hant: 資料庫服務 - zh: 数据库服务 - - default: forgejo - envKey: PANEL_DB_NAME - labelEn: Database - labelZh: 数据库名 - random: true - required: true - rule: paramCommon - type: text - label: - en: Database - ja: データベース - ms: Pangkalan Data - pt-br: Banco de Dados - ru: База данных - ko: 데이터베이스 - zh-hant: 資料庫 - zh: 数据库 - - default: forgejo - envKey: PANEL_DB_USER - random: true - required: true - rule: paramCommon - type: text - labelEn: Database User - labelZh: 数据库用户 - label: - en: Database User - ja: データベースユーザー - ms: Pengguna Pangkalan Data - pt-br: Usuário do Banco de Dados - ru: Пользователь базы данных - ko: 데이터베이스 사용자 - zh-hant: 資料庫用戶 - zh: 数据库用户 - - default: forgejo - envKey: PANEL_DB_USER_PASSWORD - random: true - required: true - rule: paramComplexity - type: password - labelEn: Database Password - labelZh: 数据库密码 - label: - en: Database Password - ja: データベースのパスワード - ms: Kata Laluan Pangkalan Data - pt-br: Senha do Banco de Dados - ru: Пароль базы данных - ko: 데이터베이스 비밀번호 - zh-hant: 資料庫密碼 - zh: 数据库密码 - - default: 3000 - envKey: PANEL_APP_PORT_HTTP - labelEn: Port - labelZh: HTTP 端口 - required: true - rule: paramPort - type: number - label: - en: HTTP Port - ja: HTTP ポート - ms: HTTP Port - pt-br: HTTP Porta - ru: HTTP Порт - ko: HTTP 포트 - zh-Hant: HTTP 埠 - zh: HTTP 端口 - - default: 222 - envKey: PANEL_APP_PORT_SSH - labelEn: Port - labelZh: SSH 端口 - required: true - rule: paramPort - type: number - label: - en: SSH Port - ja: SSH ポート - ms: SSH Port - pt-br: SSH Porta - ru: SSH Порт - ko: SSH 포트 - zh-Hant: SSH 埠 - zh: SSH 端口 + formFields: + - default: 3000 + envKey: PANEL_APP_PORT_HTTP + labelZh: HTTP 端口 + labelEn: HTTP Port + label: + zh: HTTP 端口 + zh-Hant: HTTP 埠 + en: HTTP Port + ja: HTTP ポート + ko: HTTP 포트 + ms: HTTP Port + pt-br: HTTP Porta + ru: HTTP Порт + required: true + type: number + edit: true + rule: paramPort + - default: 222 + envKey: PANEL_APP_PORT_SSH + labelZh: SSH 端口 + labelEn: SSH Port + label: + zh: SSH 端口 + zh-Hant: SSH 埠 + en: SSH Port + ja: SSH ポート + ko: SSH 포트 + ms: SSH Port + pt-br: SSH Porta + ru: SSH Порт + required: true + type: number + edit: true + rule: paramPort + - default: mysql + envKey: PANEL_DB_TYPE + labelZh: 数据库 + labelEn: Database + label: + en: Database + ja: データベース + ko: 데이터베이스 + ms: Pangkalan Data + pt-br: Banco de Dados + ru: База данных + tr: Veritabanı + zh: 数据库 + zh-Hant: 資料庫 + required: true + type: apps + values: + - label: MySQL + value: mysql + - label: PostgreSQL + value: postgres + child: + default: "" + envKey: PANEL_DB_HOST + required: true + type: service + - default: forgejo + envKey: PANEL_DB_NAME + labelZh: 数据库名 + labelEn: Database Name + label: + en: Database Name + ja: データベース名 + ko: 데이터베이스 이름 + ms: Nama Pangkalan Data + pt-br: Nome do Banco de Dados + ru: Имя базы данных + tr: Veritabanı Adı + zh: 数据库名 + zh-Hant: 資料庫名稱 + required: true + type: text + rule: paramCommon + random: true + - default: forgejo_user + envKey: PANEL_DB_USER + labelZh: 数据库用户名 + labelEn: Database Username + label: + en: Database Username + ja: データベースユーザー名 + ko: 데이터베이스 사용자 이름 + ms: Nama Pengguna Pangkalan Data + pt-br: Nome de Usuário do Banco de Dados + ru: Имя пользователя базы данных + tr: Veritabanı Kullanıcı Adı + zh: 数据库用户名 + zh-Hant: 資料庫使用者名稱 + required: true + type: text + rule: paramCommon + random: true + - default: forgejo_pass + envKey: PANEL_DB_USER_PASSWORD + labelZh: 数据库密码 + labelEn: Database Password + label: + en: Database Password + ja: データベースパスワード + ko: 데이터베이스 비밀번호 + ms: Kata Laluan Pangkalan Data + pt-br: Senha do Banco de Dados + ru: Пароль базы данных + tr: Veritabanı Parolası + zh: 数据库密码 + zh-Hant: 資料庫密碼 + required: true + type: password + rule: paramComplexity + random: true diff --git a/apps/forgejo/14-rootless/docker-compose.yml b/apps/forgejo/14-rootless/docker-compose.yml index a38225735..8788902eb 100644 --- a/apps/forgejo/14-rootless/docker-compose.yml +++ b/apps/forgejo/14-rootless/docker-compose.yml @@ -14,14 +14,14 @@ services: networks: - 1panel-network volumes: - - ./data:/data - - /etc/timezone:/etc/timezone:ro + - ./forgejo:/var/lib/gitea + - ./conf:/etc/gitea - /etc/localtime:/etc/localtime:ro ports: - - "${PANEL_APP_PORT_HTTP}:3000" - - "${PANEL_APP_PORT_SSH}:22" + - ${PANEL_APP_PORT_HTTP}:3000 + - ${PANEL_APP_PORT_SSH}:2222 labels: - createdBy: "Apps" + createdBy: Apps networks: 1panel-network: - external: true \ No newline at end of file + external: true diff --git a/apps/forgejo/14-rootless/scripts/upgrade.sh b/apps/forgejo/14-rootless/scripts/upgrade.sh deleted file mode 100644 index 2cf758d28..000000000 --- a/apps/forgejo/14-rootless/scripts/upgrade.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -if [[ -f ./.env ]]; then - if grep -q "PANEL_DB_TYPE" ./.env; then - echo "PANEL_DB_TYPE 已存在" - else - echo 'PANEL_DB_TYPE="mysql"' >> ./.env - fi -else - echo ".env 文件不存在" -fi \ No newline at end of file diff --git a/apps/forgejo/14.0.1-rootless/data.yml b/apps/forgejo/14.0.1-rootless/data.yml index d91ae5e28..adf1b031a 100644 --- a/apps/forgejo/14.0.1-rootless/data.yml +++ b/apps/forgejo/14.0.1-rootless/data.yml @@ -1,110 +1,116 @@ additionalProperties: - formFields: - - default: mysql - envKey: PANEL_DB_TYPE - labelEn: Database Service - labelZh: 数据库服务 - required: true - type: apps - child: - default: "" - envKey: PANEL_DB_HOST - required: true - type: service - values: - - label: MySQL - value: mysql - - label: PostgreSQL - value: postgres - label: - en: Database Service - ja: データベースサービス - ms: Perkhidmatan Pangkalan Data - pt-br: Serviço de Banco de Dados - ru: Сервис баз данных - ko: 데이터베이스 서비스 - zh-hant: 資料庫服務 - zh: 数据库服务 - - default: forgejo - envKey: PANEL_DB_NAME - labelEn: Database - labelZh: 数据库名 - random: true - required: true - rule: paramCommon - type: text - label: - en: Database - ja: データベース - ms: Pangkalan Data - pt-br: Banco de Dados - ru: База данных - ko: 데이터베이스 - zh-hant: 資料庫 - zh: 数据库 - - default: forgejo - envKey: PANEL_DB_USER - random: true - required: true - rule: paramCommon - type: text - labelEn: Database User - labelZh: 数据库用户 - label: - en: Database User - ja: データベースユーザー - ms: Pengguna Pangkalan Data - pt-br: Usuário do Banco de Dados - ru: Пользователь базы данных - ko: 데이터베이스 사용자 - zh-hant: 資料庫用戶 - zh: 数据库用户 - - default: forgejo - envKey: PANEL_DB_USER_PASSWORD - random: true - required: true - rule: paramComplexity - type: password - labelEn: Database Password - labelZh: 数据库密码 - label: - en: Database Password - ja: データベースのパスワード - ms: Kata Laluan Pangkalan Data - pt-br: Senha do Banco de Dados - ru: Пароль базы данных - ko: 데이터베이스 비밀번호 - zh-hant: 資料庫密碼 - zh: 数据库密码 - - default: 3000 - envKey: PANEL_APP_PORT_HTTP - labelEn: Port - labelZh: HTTP 端口 - required: true - rule: paramPort - type: number - label: - en: HTTP Port - ja: HTTP ポート - ms: HTTP Port - pt-br: HTTP Porta - ru: HTTP Порт - ko: HTTP 포트 - zh-Hant: HTTP 埠 - zh: HTTP 端口 - - default: 222 - envKey: PANEL_APP_PORT_SSH - labelEn: Port - labelZh: SSH 端口 - required: true - rule: paramPort - type: number - label: - en: SSH Port - ja: SSH ポート - ms: SSH Port - pt-br: SSH Porta - ru: SSH Порт - ko: SSH 포트 - zh-Hant: SSH 埠 - zh: SSH 端口 + formFields: + - default: 3000 + envKey: PANEL_APP_PORT_HTTP + labelZh: HTTP 端口 + labelEn: HTTP Port + label: + zh: HTTP 端口 + zh-Hant: HTTP 埠 + en: HTTP Port + ja: HTTP ポート + ko: HTTP 포트 + ms: HTTP Port + pt-br: HTTP Porta + ru: HTTP Порт + required: true + type: number + edit: true + rule: paramPort + - default: 222 + envKey: PANEL_APP_PORT_SSH + labelZh: SSH 端口 + labelEn: SSH Port + label: + zh: SSH 端口 + zh-Hant: SSH 埠 + en: SSH Port + ja: SSH ポート + ko: SSH 포트 + ms: SSH Port + pt-br: SSH Porta + ru: SSH Порт + required: true + type: number + edit: true + rule: paramPort + - default: mysql + envKey: PANEL_DB_TYPE + labelZh: 数据库 + labelEn: Database + label: + en: Database + ja: データベース + ko: 데이터베이스 + ms: Pangkalan Data + pt-br: Banco de Dados + ru: База данных + tr: Veritabanı + zh: 数据库 + zh-Hant: 資料庫 + required: true + type: apps + values: + - label: MySQL + value: mysql + - label: PostgreSQL + value: postgres + child: + default: "" + envKey: PANEL_DB_HOST + required: true + type: service + - default: forgejo + envKey: PANEL_DB_NAME + labelZh: 数据库名 + labelEn: Database Name + label: + en: Database Name + ja: データベース名 + ko: 데이터베이스 이름 + ms: Nama Pangkalan Data + pt-br: Nome do Banco de Dados + ru: Имя базы данных + tr: Veritabanı Adı + zh: 数据库名 + zh-Hant: 資料庫名稱 + required: true + type: text + rule: paramCommon + random: true + - default: forgejo_user + envKey: PANEL_DB_USER + labelZh: 数据库用户名 + labelEn: Database Username + label: + en: Database Username + ja: データベースユーザー名 + ko: 데이터베이스 사용자 이름 + ms: Nama Pengguna Pangkalan Data + pt-br: Nome de Usuário do Banco de Dados + ru: Имя пользователя базы данных + tr: Veritabanı Kullanıcı Adı + zh: 数据库用户名 + zh-Hant: 資料庫使用者名稱 + required: true + type: text + rule: paramCommon + random: true + - default: forgejo_pass + envKey: PANEL_DB_USER_PASSWORD + labelZh: 数据库密码 + labelEn: Database Password + label: + en: Database Password + ja: データベースパスワード + ko: 데이터베이스 비밀번호 + ms: Kata Laluan Pangkalan Data + pt-br: Senha do Banco de Dados + ru: Пароль базы данных + tr: Veritabanı Parolası + zh: 数据库密码 + zh-Hant: 資料庫密碼 + required: true + type: password + rule: paramComplexity + random: true diff --git a/apps/forgejo/14.0.1-rootless/docker-compose.yml b/apps/forgejo/14.0.1-rootless/docker-compose.yml index 38e985440..98973a8b8 100644 --- a/apps/forgejo/14.0.1-rootless/docker-compose.yml +++ b/apps/forgejo/14.0.1-rootless/docker-compose.yml @@ -14,14 +14,14 @@ services: networks: - 1panel-network volumes: - - ./data:/data - - /etc/timezone:/etc/timezone:ro + - ./forgejo:/var/lib/gitea + - ./conf:/etc/gitea - /etc/localtime:/etc/localtime:ro ports: - - "${PANEL_APP_PORT_HTTP}:3000" - - "${PANEL_APP_PORT_SSH}:22" + - ${PANEL_APP_PORT_HTTP}:3000 + - ${PANEL_APP_PORT_SSH}:2222 labels: - createdBy: "Apps" + createdBy: Apps networks: 1panel-network: - external: true \ No newline at end of file + external: true diff --git a/apps/forgejo/14.0.1-rootless/scripts/upgrade.sh b/apps/forgejo/14.0.1-rootless/scripts/upgrade.sh deleted file mode 100644 index 2cf758d28..000000000 --- a/apps/forgejo/14.0.1-rootless/scripts/upgrade.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -if [[ -f ./.env ]]; then - if grep -q "PANEL_DB_TYPE" ./.env; then - echo "PANEL_DB_TYPE 已存在" - else - echo 'PANEL_DB_TYPE="mysql"' >> ./.env - fi -else - echo ".env 文件不存在" -fi \ No newline at end of file diff --git a/apps/forgejo/14.0.1/data.yml b/apps/forgejo/14.0.1/data.yml index d91ae5e28..adf1b031a 100644 --- a/apps/forgejo/14.0.1/data.yml +++ b/apps/forgejo/14.0.1/data.yml @@ -1,110 +1,116 @@ additionalProperties: - formFields: - - default: mysql - envKey: PANEL_DB_TYPE - labelEn: Database Service - labelZh: 数据库服务 - required: true - type: apps - child: - default: "" - envKey: PANEL_DB_HOST - required: true - type: service - values: - - label: MySQL - value: mysql - - label: PostgreSQL - value: postgres - label: - en: Database Service - ja: データベースサービス - ms: Perkhidmatan Pangkalan Data - pt-br: Serviço de Banco de Dados - ru: Сервис баз данных - ko: 데이터베이스 서비스 - zh-hant: 資料庫服務 - zh: 数据库服务 - - default: forgejo - envKey: PANEL_DB_NAME - labelEn: Database - labelZh: 数据库名 - random: true - required: true - rule: paramCommon - type: text - label: - en: Database - ja: データベース - ms: Pangkalan Data - pt-br: Banco de Dados - ru: База данных - ko: 데이터베이스 - zh-hant: 資料庫 - zh: 数据库 - - default: forgejo - envKey: PANEL_DB_USER - random: true - required: true - rule: paramCommon - type: text - labelEn: Database User - labelZh: 数据库用户 - label: - en: Database User - ja: データベースユーザー - ms: Pengguna Pangkalan Data - pt-br: Usuário do Banco de Dados - ru: Пользователь базы данных - ko: 데이터베이스 사용자 - zh-hant: 資料庫用戶 - zh: 数据库用户 - - default: forgejo - envKey: PANEL_DB_USER_PASSWORD - random: true - required: true - rule: paramComplexity - type: password - labelEn: Database Password - labelZh: 数据库密码 - label: - en: Database Password - ja: データベースのパスワード - ms: Kata Laluan Pangkalan Data - pt-br: Senha do Banco de Dados - ru: Пароль базы данных - ko: 데이터베이스 비밀번호 - zh-hant: 資料庫密碼 - zh: 数据库密码 - - default: 3000 - envKey: PANEL_APP_PORT_HTTP - labelEn: Port - labelZh: HTTP 端口 - required: true - rule: paramPort - type: number - label: - en: HTTP Port - ja: HTTP ポート - ms: HTTP Port - pt-br: HTTP Porta - ru: HTTP Порт - ko: HTTP 포트 - zh-Hant: HTTP 埠 - zh: HTTP 端口 - - default: 222 - envKey: PANEL_APP_PORT_SSH - labelEn: Port - labelZh: SSH 端口 - required: true - rule: paramPort - type: number - label: - en: SSH Port - ja: SSH ポート - ms: SSH Port - pt-br: SSH Porta - ru: SSH Порт - ko: SSH 포트 - zh-Hant: SSH 埠 - zh: SSH 端口 + formFields: + - default: 3000 + envKey: PANEL_APP_PORT_HTTP + labelZh: HTTP 端口 + labelEn: HTTP Port + label: + zh: HTTP 端口 + zh-Hant: HTTP 埠 + en: HTTP Port + ja: HTTP ポート + ko: HTTP 포트 + ms: HTTP Port + pt-br: HTTP Porta + ru: HTTP Порт + required: true + type: number + edit: true + rule: paramPort + - default: 222 + envKey: PANEL_APP_PORT_SSH + labelZh: SSH 端口 + labelEn: SSH Port + label: + zh: SSH 端口 + zh-Hant: SSH 埠 + en: SSH Port + ja: SSH ポート + ko: SSH 포트 + ms: SSH Port + pt-br: SSH Porta + ru: SSH Порт + required: true + type: number + edit: true + rule: paramPort + - default: mysql + envKey: PANEL_DB_TYPE + labelZh: 数据库 + labelEn: Database + label: + en: Database + ja: データベース + ko: 데이터베이스 + ms: Pangkalan Data + pt-br: Banco de Dados + ru: База данных + tr: Veritabanı + zh: 数据库 + zh-Hant: 資料庫 + required: true + type: apps + values: + - label: MySQL + value: mysql + - label: PostgreSQL + value: postgres + child: + default: "" + envKey: PANEL_DB_HOST + required: true + type: service + - default: forgejo + envKey: PANEL_DB_NAME + labelZh: 数据库名 + labelEn: Database Name + label: + en: Database Name + ja: データベース名 + ko: 데이터베이스 이름 + ms: Nama Pangkalan Data + pt-br: Nome do Banco de Dados + ru: Имя базы данных + tr: Veritabanı Adı + zh: 数据库名 + zh-Hant: 資料庫名稱 + required: true + type: text + rule: paramCommon + random: true + - default: forgejo_user + envKey: PANEL_DB_USER + labelZh: 数据库用户名 + labelEn: Database Username + label: + en: Database Username + ja: データベースユーザー名 + ko: 데이터베이스 사용자 이름 + ms: Nama Pengguna Pangkalan Data + pt-br: Nome de Usuário do Banco de Dados + ru: Имя пользователя базы данных + tr: Veritabanı Kullanıcı Adı + zh: 数据库用户名 + zh-Hant: 資料庫使用者名稱 + required: true + type: text + rule: paramCommon + random: true + - default: forgejo_pass + envKey: PANEL_DB_USER_PASSWORD + labelZh: 数据库密码 + labelEn: Database Password + label: + en: Database Password + ja: データベースパスワード + ko: 데이터베이스 비밀번호 + ms: Kata Laluan Pangkalan Data + pt-br: Senha do Banco de Dados + ru: Пароль базы данных + tr: Veritabanı Parolası + zh: 数据库密码 + zh-Hant: 資料庫密碼 + required: true + type: password + rule: paramComplexity + random: true diff --git a/apps/forgejo/14.0.1/docker-compose.yml b/apps/forgejo/14.0.1/docker-compose.yml index 129c96ee0..b6e93740a 100644 --- a/apps/forgejo/14.0.1/docker-compose.yml +++ b/apps/forgejo/14.0.1/docker-compose.yml @@ -14,14 +14,13 @@ services: networks: - 1panel-network volumes: - - ./data:/data - - /etc/timezone:/etc/timezone:ro + - ./forgejo:/data - /etc/localtime:/etc/localtime:ro ports: - - "${PANEL_APP_PORT_HTTP}:3000" - - "${PANEL_APP_PORT_SSH}:22" + - ${PANEL_APP_PORT_HTTP}:3000 + - ${PANEL_APP_PORT_SSH}:22 labels: - createdBy: "Apps" + createdBy: Apps networks: 1panel-network: - external: true \ No newline at end of file + external: true diff --git a/apps/forgejo/14.0.1/scripts/upgrade.sh b/apps/forgejo/14.0.1/scripts/upgrade.sh deleted file mode 100644 index 2cf758d28..000000000 --- a/apps/forgejo/14.0.1/scripts/upgrade.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -if [[ -f ./.env ]]; then - if grep -q "PANEL_DB_TYPE" ./.env; then - echo "PANEL_DB_TYPE 已存在" - else - echo 'PANEL_DB_TYPE="mysql"' >> ./.env - fi -else - echo ".env 文件不存在" -fi \ No newline at end of file diff --git a/apps/forgejo/14/data.yml b/apps/forgejo/14/data.yml index d91ae5e28..adf1b031a 100644 --- a/apps/forgejo/14/data.yml +++ b/apps/forgejo/14/data.yml @@ -1,110 +1,116 @@ additionalProperties: - formFields: - - default: mysql - envKey: PANEL_DB_TYPE - labelEn: Database Service - labelZh: 数据库服务 - required: true - type: apps - child: - default: "" - envKey: PANEL_DB_HOST - required: true - type: service - values: - - label: MySQL - value: mysql - - label: PostgreSQL - value: postgres - label: - en: Database Service - ja: データベースサービス - ms: Perkhidmatan Pangkalan Data - pt-br: Serviço de Banco de Dados - ru: Сервис баз данных - ko: 데이터베이스 서비스 - zh-hant: 資料庫服務 - zh: 数据库服务 - - default: forgejo - envKey: PANEL_DB_NAME - labelEn: Database - labelZh: 数据库名 - random: true - required: true - rule: paramCommon - type: text - label: - en: Database - ja: データベース - ms: Pangkalan Data - pt-br: Banco de Dados - ru: База данных - ko: 데이터베이스 - zh-hant: 資料庫 - zh: 数据库 - - default: forgejo - envKey: PANEL_DB_USER - random: true - required: true - rule: paramCommon - type: text - labelEn: Database User - labelZh: 数据库用户 - label: - en: Database User - ja: データベースユーザー - ms: Pengguna Pangkalan Data - pt-br: Usuário do Banco de Dados - ru: Пользователь базы данных - ko: 데이터베이스 사용자 - zh-hant: 資料庫用戶 - zh: 数据库用户 - - default: forgejo - envKey: PANEL_DB_USER_PASSWORD - random: true - required: true - rule: paramComplexity - type: password - labelEn: Database Password - labelZh: 数据库密码 - label: - en: Database Password - ja: データベースのパスワード - ms: Kata Laluan Pangkalan Data - pt-br: Senha do Banco de Dados - ru: Пароль базы данных - ko: 데이터베이스 비밀번호 - zh-hant: 資料庫密碼 - zh: 数据库密码 - - default: 3000 - envKey: PANEL_APP_PORT_HTTP - labelEn: Port - labelZh: HTTP 端口 - required: true - rule: paramPort - type: number - label: - en: HTTP Port - ja: HTTP ポート - ms: HTTP Port - pt-br: HTTP Porta - ru: HTTP Порт - ko: HTTP 포트 - zh-Hant: HTTP 埠 - zh: HTTP 端口 - - default: 222 - envKey: PANEL_APP_PORT_SSH - labelEn: Port - labelZh: SSH 端口 - required: true - rule: paramPort - type: number - label: - en: SSH Port - ja: SSH ポート - ms: SSH Port - pt-br: SSH Porta - ru: SSH Порт - ko: SSH 포트 - zh-Hant: SSH 埠 - zh: SSH 端口 + formFields: + - default: 3000 + envKey: PANEL_APP_PORT_HTTP + labelZh: HTTP 端口 + labelEn: HTTP Port + label: + zh: HTTP 端口 + zh-Hant: HTTP 埠 + en: HTTP Port + ja: HTTP ポート + ko: HTTP 포트 + ms: HTTP Port + pt-br: HTTP Porta + ru: HTTP Порт + required: true + type: number + edit: true + rule: paramPort + - default: 222 + envKey: PANEL_APP_PORT_SSH + labelZh: SSH 端口 + labelEn: SSH Port + label: + zh: SSH 端口 + zh-Hant: SSH 埠 + en: SSH Port + ja: SSH ポート + ko: SSH 포트 + ms: SSH Port + pt-br: SSH Porta + ru: SSH Порт + required: true + type: number + edit: true + rule: paramPort + - default: mysql + envKey: PANEL_DB_TYPE + labelZh: 数据库 + labelEn: Database + label: + en: Database + ja: データベース + ko: 데이터베이스 + ms: Pangkalan Data + pt-br: Banco de Dados + ru: База данных + tr: Veritabanı + zh: 数据库 + zh-Hant: 資料庫 + required: true + type: apps + values: + - label: MySQL + value: mysql + - label: PostgreSQL + value: postgres + child: + default: "" + envKey: PANEL_DB_HOST + required: true + type: service + - default: forgejo + envKey: PANEL_DB_NAME + labelZh: 数据库名 + labelEn: Database Name + label: + en: Database Name + ja: データベース名 + ko: 데이터베이스 이름 + ms: Nama Pangkalan Data + pt-br: Nome do Banco de Dados + ru: Имя базы данных + tr: Veritabanı Adı + zh: 数据库名 + zh-Hant: 資料庫名稱 + required: true + type: text + rule: paramCommon + random: true + - default: forgejo_user + envKey: PANEL_DB_USER + labelZh: 数据库用户名 + labelEn: Database Username + label: + en: Database Username + ja: データベースユーザー名 + ko: 데이터베이스 사용자 이름 + ms: Nama Pengguna Pangkalan Data + pt-br: Nome de Usuário do Banco de Dados + ru: Имя пользователя базы данных + tr: Veritabanı Kullanıcı Adı + zh: 数据库用户名 + zh-Hant: 資料庫使用者名稱 + required: true + type: text + rule: paramCommon + random: true + - default: forgejo_pass + envKey: PANEL_DB_USER_PASSWORD + labelZh: 数据库密码 + labelEn: Database Password + label: + en: Database Password + ja: データベースパスワード + ko: 데이터베이스 비밀번호 + ms: Kata Laluan Pangkalan Data + pt-br: Senha do Banco de Dados + ru: Пароль базы данных + tr: Veritabanı Parolası + zh: 数据库密码 + zh-Hant: 資料庫密碼 + required: true + type: password + rule: paramComplexity + random: true diff --git a/apps/forgejo/14/docker-compose.yml b/apps/forgejo/14/docker-compose.yml index fbb4a5feb..83890413f 100644 --- a/apps/forgejo/14/docker-compose.yml +++ b/apps/forgejo/14/docker-compose.yml @@ -14,14 +14,13 @@ services: networks: - 1panel-network volumes: - - ./data:/data - - /etc/timezone:/etc/timezone:ro + - ./forgejo:/data - /etc/localtime:/etc/localtime:ro ports: - - "${PANEL_APP_PORT_HTTP}:3000" - - "${PANEL_APP_PORT_SSH}:22" + - ${PANEL_APP_PORT_HTTP}:3000 + - ${PANEL_APP_PORT_SSH}:22 labels: - createdBy: "Apps" + createdBy: Apps networks: 1panel-network: - external: true \ No newline at end of file + external: true diff --git a/apps/forgejo/14/scripts/upgrade.sh b/apps/forgejo/14/scripts/upgrade.sh deleted file mode 100644 index 2cf758d28..000000000 --- a/apps/forgejo/14/scripts/upgrade.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -if [[ -f ./.env ]]; then - if grep -q "PANEL_DB_TYPE" ./.env; then - echo "PANEL_DB_TYPE 已存在" - else - echo 'PANEL_DB_TYPE="mysql"' >> ./.env - fi -else - echo ".env 文件不存在" -fi \ No newline at end of file diff --git a/apps/forgejo/README.md b/apps/forgejo/README.md index 7dc40e5d2..25115fea8 100644 --- a/apps/forgejo/README.md +++ b/apps/forgejo/README.md @@ -1,10 +1,11 @@ -# Forgejo +## 产品介绍 -**Forgejo** 是一个由社区驱动的开源代码协作平台,专注于为开发者提供安全、自主可控的代码托管与 DevOps 工具链。它基于 Gitea 分支发展而来,继承了轻量高效的特性,同时强化了对开放治理、隐私保护及可持续生态的支持,是自托管场景下的理想选择。 +Forgejo 是一个轻量级、隐私优先的自托管 Git 服务平台,由独立社区驱动。项目于 2022 年从 Gitea 分叉而来,旨在提供一个永远独立、自由的软件协作平台,避免大型平台的垄断。Forgejo 提供直观的界面、易于部署的特性,并包含丰富的内置功能,适合个人、团队、公司或社区进行代码托管、项目管理和协作开发。其核心价值在于强调隐私、社区所有权和可定制性,目标用户包括需要自托管 Git 服务的开发者、开源项目维护者以及注重数据控制权的组织。 -## 优势: +## 主要功能 -- **社区驱动**:完全由开源社区主导,开发透明且路线图开放,保障用户需求优先。 -- **隐私至上**:支持私有化部署,赋予用户对数据的绝对控制权,满足企业级安全合规要求。 -- **轻量高效**:基于 Go 语言构建,低资源消耗、高性能响应,适配从个人到团队的多规模场景。 -- **开放治理**:通过去中心化协作模式推动发展,倡导代码自由与工具伦理,拒绝商业绑定。 +- **完整的 Git 托管**:提供完整的 Git 仓库托管功能,支持分支、标签、代码浏览和历史管理等基本操作,可在树莓派等低资源设备上轻松运行。 +- **项目管理与协作**:内置问题追踪、拉取请求、Wiki 文档、看板 (Kanban) 等协作工具,帮助团队高效协调开发进度和沟通。 +- **软件发布与包管理**:通过“发布”功能托管软件下载,并提供包注册表 (Package Registry) 支持 Docker、npm 等多种包管理器的软件发布与分发。 +- **高级功能**:提供丰富的配置选项和主题定制,支持组织与团队权限、CI/CD 集成、代码搜索、LDAP、OAuth 等企业级需求。 +- **去中心化互联(开发中)**:正在开发基于 ActivityPub 的去中心化互联功能,以实现不同 Forgejo 实例之间的互联与协作。 diff --git a/apps/forgejo/README_en.md b/apps/forgejo/README_en.md index 2c42cc59e..b0ff9100a 100644 --- a/apps/forgejo/README_en.md +++ b/apps/forgejo/README_en.md @@ -1,10 +1,11 @@ -# Forgejo +## Product Introduction -**Forgejo** is a community-driven open-source code collaboration platform, dedicated to providing developers with secure, self-controlled code hosting and DevOps toolchains. It is developed as a fork of Gitea, inheriting its lightweight and efficient characteristics while enhancing support for open governance, privacy protection, and sustainable ecosystems. It is an ideal choice for self-hosted scenarios. +Forgejo is a lightweight, privacy-first self-hosted Git service platform driven by an independent community. The project forked from Gitea in 2022, aiming to provide a forever independent and free software collaboration platform, avoiding the monopoly of large platforms. Forgejo offers an intuitive interface, easy deployment, and includes rich built-in features, making it suitable for individuals, teams, companies, or communities for code hosting, project management, and collaborative development. Its core values emphasize privacy, community ownership, and customizability, targeting developers who need self-hosted Git services, open-source project maintainers, and organizations that prioritize data control. -## Advantages: +- **Complete Git Hosting**: Provides full Git repository hosting functionality, supporting basic operations such as branches, tags, code browsing, and history management. It can run easily on low-resource devices like Raspberry Pi. -- **Community-Driven**: Fully led by the open-source community, with transparent development and an open roadmap, ensuring user needs are prioritized. -- **Privacy-First**: Supports private deployment, giving users absolute control over their data and meeting enterprise-level security and compliance requirements. -- **Lightweight and Efficient**: Built with Go, it features low resource consumption and high-performance responsiveness, suitable for scenarios ranging from individual use to team collaboration. -- **Open Governance**: Promotes development through a decentralized collaboration model, advocating for code freedom and tool ethics, and rejecting commercial lock-in. \ No newline at end of file +- **Project Management and Collaboration**: Includes built-in collaboration tools like issue tracking, pull requests, Wiki documentation, and Kanban boards to help teams efficiently coordinate development progress and communication. +## Main Features +- **Software Release and Package Management**: Hosts software downloads through the "Releases" feature and provides a Package Registry that supports software release and distribution for various package managers such as Docker and npm. +- **Advanced Features**: Offers extensive configuration options and theme customization, supporting enterprise-level needs such as organization and team permissions, CI/CD integration, code search, LDAP, OAuth, and more. +- **Decentralized Interconnection (in development)**: Currently developing ActivityPub-based decentralized interconnection functionality to enable connectivity and collaboration between different Forgejo instances. diff --git a/apps/forgejo/data.yml b/apps/forgejo/data.yml index 843ab0c84..f3fc09a4f 100644 --- a/apps/forgejo/data.yml +++ b/apps/forgejo/data.yml @@ -1,28 +1,31 @@ name: Forgejo tags: - - DevOps -title: 新一代的代码托管平台 -description: 新一代的代码托管平台 + - DevOps +title: 下一代代码托管平台 +description: 下一代代码托管平台 additionalProperties: - key: forgejo - name: Forgejo - tags: - - DevOps - shortDescZh: 新一代的代码托管平台 - shortDescEn: The next generation of code hosting platform - description: - en: The next generation of code hosting platform - ja: 次世代のコードホスティングプラットフォーム - ms: Platform hosting kod generasi seterusnya - pt-br: A próxima geração de plataforma de hospedagem de código - ru: Платформа хостинга кода следующего поколения - ko: 다음 세대 코드 호스팅 플랫폼 - zh-Hant: 下一代代碼託管平台 - zh: 下一代代码托管平台 - type: tool - crossVersionUpdate: true - limit: 0 - recommend: 55 - website: https://forgejo.org/ - github: https://codeberg.org/forgejo/forgejo - document: https://forgejo.org/docs/ + key: forgejo + name: Forgejo + tags: + - DevOps + shortDescZh: 下一代代码托管平台 + shortDescEn: The next generation of code hosting platform + description: + en: The next generation of code hosting platform + zh: 下一代代码托管平台 + zh-Hant: 下一代代碼託管平台 + ja: 次世代のコードホスティングプラットフォーム + ms: Platform hosting kod generasi seterusnya + pt-br: A próxima geração de plataforma de hospedagem de código + ru: Платформа хостинга кода следующего поколения + ko: 다음 세대 코드 호스팅 플랫폼 + type: website + crossVersionUpdate: true + limit: 0 + website: https://forgejo.org + github: https://codeberg.org/forgejo/forgejo + document: https://forgejo.org/docs + architectures: + - amd64 + - arm64 + - arm/v6 diff --git a/apps/forgejo/logo.png b/apps/forgejo/logo.png index e1a191294d841984ab1f13357c1928d98eda1ab5..d23209e26565e76a010ffa98ad4186d6360e85d5 100644 GIT binary patch literal 4986 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 literal 9516 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 u6`XIVf