From bca54e05140e141e3aaecee7475dff07096131b9 Mon Sep 17 00:00:00 2001 From: GuGuGu Date: Mon, 3 Mar 2025 07:46:45 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0Planka=20(#3334)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: GuGuGu --- planka/1.24.4/data.yml | 108 +++++++++++++++++++++++++++++++ planka/1.24.4/docker-compose.yml | 96 +++++++++++++++++++++++++++ planka/README.md | 24 +++++++ planka/data.yml | 13 ++++ planka/logo.png | Bin 0 -> 10720 bytes 5 files changed, 241 insertions(+) create mode 100644 planka/1.24.4/data.yml create mode 100644 planka/1.24.4/docker-compose.yml create mode 100644 planka/README.md create mode 100644 planka/data.yml create mode 100644 planka/logo.png diff --git a/planka/1.24.4/data.yml b/planka/1.24.4/data.yml new file mode 100644 index 000000000..f91b54bbf --- /dev/null +++ b/planka/1.24.4/data.yml @@ -0,0 +1,108 @@ +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 diff --git a/planka/1.24.4/docker-compose.yml b/planka/1.24.4/docker-compose.yml new file mode 100644 index 000000000..185d0b30c --- /dev/null +++ b/planka/1.24.4/docker-compose.yml @@ -0,0 +1,96 @@ +services: + planka: + image: ghcr.io/plankanban/planka:1.24.4 + container_name: ${CONTAINER_NAME} + environment: + - 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} + + # - TRUST_PROXY=0 + # - TOKEN_EXPIRES_IN=365 # In days + + # related: https://github.com/knex/knex/issues/2354 + # As knex does not pass query parameters from the connection string we + # have to use environment variables in order to pass the desired values, e.g. + # - PGSSLMODE= + + # 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 + + # - S3_ENDPOINT= + # - S3_REGION= + # - S3_ACCESS_KEY_ID= + # - S3_SECRET_ACCESS_KEY= + # - S3_BUCKET= + # - S3_FORCE_PATH_STYLE=true + + # - OIDC_ISSUER= + # - OIDC_CLIENT_ID= + # - OIDC_CLIENT_SECRET= + # - OIDC_ID_TOKEN_SIGNED_RESPONSE_ALG= + # - OIDC_USERINFO_SIGNED_RESPONSE_ALG= + # - OIDC_SCOPES=openid email profile + # - OIDC_RESPONSE_MODE=fragment + # - OIDC_USE_DEFAULT_RESPONSE_MODE=true + # - OIDC_ADMIN_ROLES=admin + # - OIDC_CLAIMS_SOURCE=userinfo + # - OIDC_EMAIL_ATTRIBUTE=email + # - OIDC_NAME_ATTRIBUTE=name + # - OIDC_USERNAME_ATTRIBUTE=preferred_username + # - OIDC_ROLES_ATTRIBUTE=groups + # - OIDC_IGNORE_USERNAME=true + # - OIDC_IGNORE_ROLES=true + # - OIDC_ENFORCED=true + + # Email Notifications (https://nodemailer.com/smtp/) + # - SMTP_HOST= + # - SMTP_PORT=587 + # - SMTP_NAME= + # - SMTP_SECURE=true + # - SMTP_USER= + # - SMTP_PASSWORD= + # - SMTP_FROM="Demo Demo" + # - SMTP_TLS_REJECT_UNAUTHORIZED=false + + # Optional fields: accessToken, events, excludedEvents + # - | + # WEBHOOKS=[{ + # "url": "http://localhost:3001", + # "accessToken": "notaccesstoken", + # "events": ["cardCreate", "cardUpdate", "cardDelete"], + # "excludedEvents": ["notificationCreate", "notificationUpdate"] + # }] + + # - SLACK_BOT_TOKEN= + # - SLACK_CHANNEL_ID= + + # - GOOGLE_CHAT_WEBHOOK_URL= + + # - TELEGRAM_BOT_TOKEN= + # - TELEGRAM_CHAT_ID= + # - TELEGRAM_THREAD_ID= + restart: always + networks: + - 1panel-network + volumes: + - ./user-avatars:/app/public/user-avatars + - ./project-background-images:/app/public/project-background-images + - ./attachments:/app/private/attachments + + ports: + - "${PANEL_APP_PORT_HTTP}:1337" + labels: + createdBy: "Apps" +networks: + 1panel-network: + external: true \ No newline at end of file diff --git a/planka/README.md b/planka/README.md new file mode 100644 index 000000000..bd6e36f01 --- /dev/null +++ b/planka/README.md @@ -0,0 +1,24 @@ +`安装时可根据需要编辑 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** 是一款开源、自托管的项目管理工具,类似 Trello,基于 **Node.js、React 和 PostgreSQL** 构建。 + +## 🌟 主要特性 +- 📌 **可视化看板** —— 拖拽操作直观,管理任务更高效 +- 👥 **团队协作** —— 支持多用户,灵活权限管理 +- 🔄 **实时同步** —— WebSockets 确保多端数据即时更新 +- 🚀 **轻量高效** —— 运行流畅,占用资源少 diff --git a/planka/data.yml b/planka/data.yml new file mode 100644 index 000000000..95172c093 --- /dev/null +++ b/planka/data.yml @@ -0,0 +1,13 @@ +additionalProperties: + key: planka + 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 diff --git a/planka/logo.png b/planka/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..33f3bbcd07a1ac6d88ef535b6c2df98e73fbd359 GIT binary patch literal 10720 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 literal 0 HcmV?d00001