From 9bfa2b7486336777c0fbd0e7b7b40939bb6b7fc3 Mon Sep 17 00:00:00 2001 From: xiwangly2 Date: Tue, 18 Feb 2025 14:10:21 +0800 Subject: [PATCH] feat: Add Forgejo --- apps/forgejo/10/data.yml | 110 +++++++++++++++++++++++++++++ apps/forgejo/10/docker-compose.yml | 27 +++++++ apps/forgejo/10/scripts/upgrade.sh | 11 +++ apps/forgejo/README.md | 10 +++ apps/forgejo/README_en.md | 10 +++ apps/forgejo/data.yml | 28 ++++++++ apps/forgejo/logo.png | Bin 0 -> 9516 bytes 7 files changed, 196 insertions(+) create mode 100644 apps/forgejo/10/data.yml create mode 100644 apps/forgejo/10/docker-compose.yml create mode 100644 apps/forgejo/10/scripts/upgrade.sh create mode 100644 apps/forgejo/README.md create mode 100644 apps/forgejo/README_en.md create mode 100644 apps/forgejo/data.yml create mode 100644 apps/forgejo/logo.png diff --git a/apps/forgejo/10/data.yml b/apps/forgejo/10/data.yml new file mode 100644 index 000000000000..d91ae5e28315 --- /dev/null +++ b/apps/forgejo/10/data.yml @@ -0,0 +1,110 @@ +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 端口 diff --git a/apps/forgejo/10/docker-compose.yml b/apps/forgejo/10/docker-compose.yml new file mode 100644 index 000000000000..174a564b9467 --- /dev/null +++ b/apps/forgejo/10/docker-compose.yml @@ -0,0 +1,27 @@ +services: + forgejo: + image: codeberg.org/forgejo/forgejo:10 + container_name: ${CONTAINER_NAME} + environment: + - USER_UID=1000 + - USER_GID=1000 + - forgejo__database__DB_TYPE=${PANEL_DB_TYPE} + - forgejo__database__HOST=${PANEL_DB_HOST}:${PANEL_DB_PORT} + - forgejo__database__NAME=${PANEL_DB_NAME} + - forgejo__database__USER=${PANEL_DB_USER} + - forgejo__database__PASSWD=${PANEL_DB_USER_PASSWORD} + restart: always + networks: + - 1panel-network + volumes: + - ./data:/data + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + ports: + - "${PANEL_APP_PORT_HTTP}:3000" + - "${PANEL_APP_PORT_SSH}:22" + labels: + createdBy: "Apps" +networks: + 1panel-network: + external: true \ No newline at end of file diff --git a/apps/forgejo/10/scripts/upgrade.sh b/apps/forgejo/10/scripts/upgrade.sh new file mode 100644 index 000000000000..2cf758d28a30 --- /dev/null +++ b/apps/forgejo/10/scripts/upgrade.sh @@ -0,0 +1,11 @@ +#!/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 new file mode 100644 index 000000000000..7dc40e5d2754 --- /dev/null +++ b/apps/forgejo/README.md @@ -0,0 +1,10 @@ +# Forgejo + +**Forgejo** 是一个由社区驱动的开源代码协作平台,专注于为开发者提供安全、自主可控的代码托管与 DevOps 工具链。它基于 Gitea 分支发展而来,继承了轻量高效的特性,同时强化了对开放治理、隐私保护及可持续生态的支持,是自托管场景下的理想选择。 + +## 优势: + +- **社区驱动**:完全由开源社区主导,开发透明且路线图开放,保障用户需求优先。 +- **隐私至上**:支持私有化部署,赋予用户对数据的绝对控制权,满足企业级安全合规要求。 +- **轻量高效**:基于 Go 语言构建,低资源消耗、高性能响应,适配从个人到团队的多规模场景。 +- **开放治理**:通过去中心化协作模式推动发展,倡导代码自由与工具伦理,拒绝商业绑定。 diff --git a/apps/forgejo/README_en.md b/apps/forgejo/README_en.md new file mode 100644 index 000000000000..2c42cc59e5a2 --- /dev/null +++ b/apps/forgejo/README_en.md @@ -0,0 +1,10 @@ +# Forgejo + +**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. + +## Advantages: + +- **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 diff --git a/apps/forgejo/data.yml b/apps/forgejo/data.yml new file mode 100644 index 000000000000..843ab0c84bff --- /dev/null +++ b/apps/forgejo/data.yml @@ -0,0 +1,28 @@ +name: Forgejo +tags: + - 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/ diff --git a/apps/forgejo/logo.png b/apps/forgejo/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e1a191294d841984ab1f13357c1928d98eda1ab5 GIT binary patch literal 9516 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 u6`XIVf