From aae92ced473b75dc93c204ef5d57870d80b21d64 Mon Sep 17 00:00:00 2001 From: wanghe-fit2cloud Date: Mon, 3 Mar 2025 15:30:11 +0800 Subject: [PATCH] feat: Update the planka package --- planka/1.24.4/data.yml | 199 ++++++++++++++----------------- planka/1.24.4/docker-compose.yml | 19 ++- planka/README.md | 28 ++--- planka/data.yml | 30 +++-- planka/logo.png | Bin 10720 -> 1962 bytes 5 files changed, 126 insertions(+), 150 deletions(-) diff --git a/planka/1.24.4/data.yml b/planka/1.24.4/data.yml index f91b54bbf..e8a2b45b7 100644 --- a/planka/1.24.4/data.yml +++ b/planka/1.24.4/data.yml @@ -1,108 +1,93 @@ additionalProperties: - formFields: - - default: postgres - envKey: PANEL_DB_TYPE - labelEn: Database Service - labelZh: 数据库服务 - required: true - type: apps - child: - default: "" - envKey: PANEL_DB_HOST - required: true - type: service - values: - - 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: planka - 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: planka - 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: planka - 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: 1337 - 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: http://localhost:1337 - edit: true - envKey: PLANKA_EXTERNAL_URL - labelEn: External URL - labelZh: 外部访问地址 - required: true - rule: paramExtUrl - type: text - - default: "planka" - edit: true - envKey: PLANKA_SECRET_KEY - labelEn: SECRET KEY - labelZh: 密钥 - random: true - required: true - type: text \ No newline at end of file + formFields: + - default: postgres + envKey: PANEL_DB_TYPE + labelEn: Database Service + labelZh: 数据库服务 + required: true + type: apps + child: + default: "" + envKey: PANEL_DB_HOST + required: true + type: service + values: + - label: PostgreSQL + value: postgres + - default: planka + envKey: PANEL_DB_NAME + labelEn: Database + labelZh: 数据库名 + random: true + required: true + rule: paramCommon + type: text + - default: planka + envKey: PANEL_DB_USER + random: true + required: true + rule: paramCommon + type: text + labelEn: Database User + labelZh: 数据库用户 + - default: planka + envKey: PANEL_DB_USER_PASSWORD + random: true + required: true + rule: paramComplexity + type: password + labelEn: Database Password + labelZh: 数据库密码 + - default: 1337 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: HTTP 端口 + required: true + rule: paramPort + type: number + - default: admin + edit: true + envKey: DEFAULT_ADMIN_USERNAME + labelEn: Admin Username + labelZh: 管理员用户名 + required: true + type: text + - default: planka + edit: true + envKey: DEFAULT_ADMIN_PASSWORD + labelEn: Admin Password + labelZh: 管理员密码 + random: true + required: true + type: password + - default: admin@planka.app + edit: true + envKey: DEFAULT_ADMIN_EMAIL + labelEn: Admin Email + labelZh: 管理员邮箱 + required: true + type: text + - default: Admin + edit: true + envKey: DEFAULT_ADMIN_NAME + labelEn: Admin Name + labelZh: 管理员姓名 + required: true + type: text + - default: http://localhost:1337 + edit: true + envKey: PLANKA_EXTERNAL_URL + labelEn: External URL + labelZh: 外部访问地址 + required: true + rule: paramExtUrl + type: text + - default: "planka" + edit: true + envKey: PLANKA_SECRET_KEY + labelEn: SECRET KEY + labelZh: 密钥 + random: true + required: true + type: text \ No newline at end of file diff --git a/planka/1.24.4/docker-compose.yml b/planka/1.24.4/docker-compose.yml index 185d0b30c..78793b49d 100644 --- a/planka/1.24.4/docker-compose.yml +++ b/planka/1.24.4/docker-compose.yml @@ -6,6 +6,12 @@ services: - BASE_URL=${PLANKA_EXTERNAL_URL} - DATABASE_URL=postgresql://${PANEL_DB_USER}:${PANEL_DB_USER_PASSWORD}@${PANEL_DB_HOST}:${PANEL_DB_PORT}/${PANEL_DB_NAME} - SECRET_KEY=${PLANKA_SECRET_KEY} + + # Do not remove if you want to prevent this user from being edited/deleted + - DEFAULT_ADMIN_NAME=${DEFAULT_ADMIN_NAME} + - DEFAULT_ADMIN_USERNAME=${DEFAULT_ADMIN_USERNAME} + - DEFAULT_ADMIN_PASSWORD=${DEFAULT_ADMIN_PASSWORD} + - DEFAULT_ADMIN_EMAIL=${DEFAULT_ADMIN_EMAIL} # - TRUST_PROXY=0 # - TOKEN_EXPIRES_IN=365 # In days @@ -17,12 +23,6 @@ services: # Configure knex to accept SSL certificates # - KNEX_REJECT_UNAUTHORIZED_SSL_CERTIFICATE=false - - # Do not remove if you want to prevent this user from being edited/deleted - - DEFAULT_ADMIN_EMAIL=demo@demo.demo - - DEFAULT_ADMIN_PASSWORD=demo - - DEFAULT_ADMIN_NAME=Demo Demo - - DEFAULT_ADMIN_USERNAME=demo # - SHOW_DETAILED_AUTH_ERRORS=false # Set to true to show more detailed authentication error messages. It should not be enabled without a rate limiter for security reasons. # - ALLOW_ALL_TO_CREATE_PROJECTS=true @@ -83,10 +83,9 @@ services: networks: - 1panel-network volumes: - - ./user-avatars:/app/public/user-avatars - - ./project-background-images:/app/public/project-background-images - - ./attachments:/app/private/attachments - + - ./data/user-avatars:/app/public/user-avatars + - ./data/project-background-images:/app/public/project-background-images + - ./data/attachments:/app/private/attachments ports: - "${PANEL_APP_PORT_HTTP}:1337" labels: diff --git a/planka/README.md b/planka/README.md index bd6e36f01..8b0919441 100644 --- a/planka/README.md +++ b/planka/README.md @@ -1,24 +1,10 @@ -`安装时可根据需要编辑 Compose 文件,调整参数` - -``` -默认禁止修改管理员账号和密码,完成部署后,请按照以下步骤操作: -1. 进入 "参数" -> "编辑" -> "高级设置" -2. 修改 Compose 文件,删除以下行: - -- DEFAULT_ADMIN_EMAIL=demo@demo.demo -- DEFAULT_ADMIN_PASSWORD=demo -- DEFAULT_ADMIN_NAME=Demo Demo -- DEFAULT_ADMIN_USERNAME=demo - -3. 重建后登陆修改 -``` - -# Planka 📌 +# Planka **Planka** 是一款开源、自托管的项目管理工具,类似 Trello,基于 **Node.js、React 和 PostgreSQL** 构建。 -## 🌟 主要特性 -- 📌 **可视化看板** —— 拖拽操作直观,管理任务更高效 -- 👥 **团队协作** —— 支持多用户,灵活权限管理 -- 🔄 **实时同步** —— WebSockets 确保多端数据即时更新 -- 🚀 **轻量高效** —— 运行流畅,占用资源少 +## 主要特性 + +- **可视化看板**:拖拽操作直观,管理任务更高效 +- **团队协作**:支持多用户,灵活权限管理 +- **实时同步**:WebSockets 确保多端数据即时更新 +- **轻量高效**:运行流畅,占用资源少 diff --git a/planka/data.yml b/planka/data.yml index 95172c093..aaf02a98f 100644 --- a/planka/data.yml +++ b/planka/data.yml @@ -1,13 +1,19 @@ -additionalProperties: - key: planka - name: Planka - tags: +name: Planka +tags: - DevOps - shortDescZh: 优雅的开源项目追踪 - shortDescEn: Elegant open source project tracking - type: tool - crossVersionUpdate: true - limit: 0 - website: https://planka.app/ - github: https://github.com/plankanban/planka - document: https://docs.planka.cloud/docs/intro \ No newline at end of file +title: 优雅的开源项目追踪 +description: 优雅的开源项目追踪 +additionalProperties: + key: planka + name: Planka + tags: + - DevOps + shortDescZh: 优雅的开源项目追踪 + shortDescEn: Elegant open source project tracking + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://planka.app/ + github: https://github.com/plankanban/planka + document: https://docs.planka.cloud/docs/intro \ No newline at end of file diff --git a/planka/logo.png b/planka/logo.png index 33f3bbcd07a1ac6d88ef535b6c2df98e73fbd359..550851edf9b125d5ac0eec90538057a943142823 100644 GIT binary patch delta 1940 zcmZvdYdn*UAI9(dHnL4^MGm8!wVB!!Qk2R0JR_0JBB7*FX;SXnM2VQg!xEWHNy(!g zl@;dHfn=qSgdA#7p&W|j?|Je6eEu)~pYN;d#qauDZ?4}p=v9v6smaR#0C4!0uXm=l z3Je(1UA^se^bH-@uG)Ge-3>YzL}mJ9GqUVUXDs58$YqxOEF=a3%wIaty~Yn z%7As5PQ!wGH9E*Z+pf0lRRB|EFXte5T8ovIhPQ=$tk0pvhvktHH~K(#8|D~=e57~g ztCHa!jMICwtT%g@p|L4`Hg(iM}DxBAwHKfk~&$zbV$Zq_OPLjTI_2bsNJ{9@|1^qe$9J>$cQFOkQx4#S& z%1@Nhq+9W|Jo!@qcTH;9Vj9*X@olQpH0?W7E?iU?^N|0Q>|T+|G*75^0=z{xGnLMH zXIgr5CF)SaVW5`hycz5xA+?y@+aW^2AFevedjO`V_#dF4g0WgvfFDY%Gx&BjFG8M= zgkq4DpgLrRb=`qt*@#g+Myxr|3~RYXljqR7LK=E@1fBUnkxFx?GGv(cb-EiIFP2+C zBhED*$msyB@Jj68<^W+pj}{w3q-J(C(wbLdb*JU8&i1mp$k_RAK$5PZXN>Ljgel5= zEv8281H}rV>L$F`2MqX|L^$5L zC5b%rCVX;QxYp%KvrN3+xfkJ?;Val2O-ZG|9=_sBiR4qP_jjtkzW;2-3YT1);PrJ6 z$3$nc3W=1_IIa1i^-^Ye)sa<);Ebj_=Ng(PwnbPuBuxXpS~OGbJDRBLa>#Lf*tO;Z z3kQzP)l?DNGRLqyeY@Z}r$+)_WYf5?#ikM&tMp>h5zRn^N{U#``oBRpm%xph zRQj&7EztDIl+tfGzNg;j_`Y?uV{+*1?l$YcU-r738eH9TBAOGy*RC9OM8 zUjvMm8XIgk5qB#nO}*-gTCg^CRB`Z7J71SaKcVc9ar1K1%xIJ(6!=a1?1jgQ=F$>w zN0tml%Y7Tjo%wlv#!~geTHE=hBmnwS!A{=a7pHI2{u!#7oYLU9E@~b`M)tuEaR{sa zbh*k&PB$akos>K{aQ>1S0h(X?dQgAlM|D|sP5~pW0j3e7Ww@cBoy>&)d(k}7c={ah z_=DNDU%D>iW9vtZ#nG5XQxrS@~EGnqX}NR;2uDkMuPTp46#Y zi1$eDRt%=H-w0_;EnH7YgR5j|zO3~Dw5e>YBh#J`Kr;b14}F0erBD_czgdJBZ92pT zTTt?(L~L0$7Kqc1os<`cL04mT(u|OAYnT0mDvZ&O1*|EI-YYDr&VsD*sGvMA#Qi~B zfPnbPHv9GHN=TX@d}ze0rXyXw>RlW{~Q$A-BKf}g5+K;j$tCj14 z3XD&0QA+qP_; zG!Rwsm%mlwH5n7UX$za1GyeAE4UlEufunU?wQq=3BgVIBcsx8vF5Abm&*>>?Nqy#=*!AT>h?@>`rX#}>yq^^d263I$ljnq) zpq<d>D38xS`m)r$>97B2qM-MnICd? zwIW-_GnArc|KUuk5DmmAKA^~2&W@&n{}qpwC*e~WO}Y3QmC~G^2ax&mOG-z=ge~DC zN1}ywRBpq)XHhx#1KR;9n*EBY(W3hG=?e=81_Ct_{+r^TkYX^%%N>bh`@Ab*&pC}F~PVrOTYp`CXrypgWuRLb} zv->$;iS+mS1Qg6p!Ygz(=?!4$?ZoZj@`R8rwyYS_0lT0k;s?ZE;{~llL%8 zVMVFCHGa&6Wlg%mKQ0v_%Barcup%{++x5E^c|0GyE@J#n;=em5GM0W4zY~dYm*+Jv Y>hyY!PYi5W-cP{E&fWI*E*8lB56rt*RR910 literal 10720 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