From f52ee06f71ae5459a3112b9de972c088f11814b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=90=8C=E6=A3=AE?= Date: Fri, 19 Jul 2024 13:16:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83=E5=BA=94=E7=94=A8=20Casdoor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 身份和访问管理(IAM)/单点登录(SSO)平台 Signed-off-by: 萌森 --- README.md | 87 ++-- apps/casdoor/1.645.0/config/init_data.json | 490 +++++++++++++++++++++ apps/casdoor/1.645.0/data.yml | 138 ++++++ apps/casdoor/1.645.0/docker-compose.yml | 31 ++ apps/casdoor/1.645.0/scripts/init.sh | 28 ++ apps/casdoor/1.645.0/scripts/uninstall.sh | 10 + apps/casdoor/1.645.0/scripts/upgrade.sh | 14 + apps/casdoor/README.md | 81 ++++ apps/casdoor/data.yml | 19 + apps/casdoor/logo.png | Bin 0 -> 38624 bytes envs/casdoor/casdoor.env | 31 ++ 11 files changed, 886 insertions(+), 43 deletions(-) create mode 100644 apps/casdoor/1.645.0/config/init_data.json create mode 100644 apps/casdoor/1.645.0/data.yml create mode 100644 apps/casdoor/1.645.0/docker-compose.yml create mode 100644 apps/casdoor/1.645.0/scripts/init.sh create mode 100644 apps/casdoor/1.645.0/scripts/uninstall.sh create mode 100644 apps/casdoor/1.645.0/scripts/upgrade.sh create mode 100644 apps/casdoor/README.md create mode 100644 apps/casdoor/data.yml create mode 100644 apps/casdoor/logo.png create mode 100644 envs/casdoor/casdoor.env diff --git a/README.md b/README.md index 7f53d3a6a..fa5a9907e 100644 --- a/README.md +++ b/README.md @@ -52,49 +52,50 @@ ## 维护状态 -| 维护状态 | 应用名称 | 官网 | 描述 | 集合 | -|:----:|:-----------------------:|:-----------------------------------------:|:---------------------------------------------------------------------|:---------:| -| 🟢 | AList | https://alist.nn.ci/ | 一款支持多重存储的文件列表程序 | | -| 🟢 | Bark | https://bark.day.app/ | 一款注重隐私、安全可控的自定义通知推送工具 | | -| 🔴 | Cookie Cloud | https://github.com/easychen/CookieCloud/ | CookieCloud是一个和自架服务器同步浏览器Cookie和LocalStorage的小工具 | | -| 🔴 | DeepLX | https://deeplx.owo.network/ | DeepL免费API(无需TOKEN) | | -| 🟢 | Dockge | https://dockge.kuma.pet/ | 面向堆栈的管理器 | | -| 🔴 | Elasticsearch | https://www.elastic.co/elasticsearch/ | Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎 | Elastic | -| 🔴 | Kibana | https://www.elastic.co/kibana/ | Kibana 针对大规模数据快速运行数据分析 | Elastic | -| 🟢 | Emby | https://emby.media/ | Emby Server 是一款个人媒体服务器,可在几乎所有设备上运行应用程序 | | -| 🟢 | Emby-lovechen | https://emby.media/ | 【开心版】Emby Server 是一款个人媒体服务器,可在几乎所有设备上运行应用程序 | | -| 🟢 | Gitea | https://gitea.io/ | 私有、快速、可靠的 DevOps 平台 | Gitea | -| 🟢 | Gitea Runner | https://gitea.io/ | 【Runner】私有、快速、可靠的 DevOps 平台 | Gitea | -| 🟢 | Halo | https://halo.run/ | 强大易用的开源建站工具 | | -| 🟢 | Immich | https://immich.app/ | 【完整版本】高性能自托管照片和视频管理解决方案 | Immich | -| 🟢 | Immich-Server | https://immich.app/ | 【主服务模块】高性能自托管照片和视频管理解决方案 | Immich | -| 🟢 | Immich-Machine-Learning | https://immich.app/ | 【机器学习模块】高性能自托管照片和视频管理解决方案 | Immich | -| 🟢 | IYUU Plus | https://doc.iyuu.cn/ | 基于特征码的索引工具 | | -| 🟢 | Jellyfin | https://jellyfin.org/ | 自由软件媒体系统 | | -| 🔴 | LinkDing | https://github.com/sissbruecker/linkding/ | 自托管书签管理器 | | -| 🔴 | MinIO | https://min.io/ | MinIO 是一种高性能、兼容 S3 的对象存储 | | -| 🟢 | MoviePilot | https://github.com/jxxghp/MoviePilot/ | NAS媒体库自动化管理工具 | | -| 🟢 | MySQL | https://www.mysql.com/ | 关系数据库管理系统 | MySQL | -| 🟢 | MariaDB | https://mariadb.org/ | 【MySQL分支】创新的开源数据库 | MySQL | -| 🟢 | Percona | https://www.percona.com/ | 【MySQL分支】关系数据库管理系统 | MySQL | -| 🔴 | Nacos | https://nacos.io/ | 动态服务发现、配置管理和服务管理平台 | | -| 🟢 | NeZha | https://nacos.io/ | 【哪吒监控】开源、轻量、易用的服务器监控、运维工具 | | -| 🟢 | OneDev | https://onedev.io/ | DevOps 平台、带有 CI/CD、看板和软件包的 Git 服务器 | | -| 🟢 | OutLine | https://www.getoutline.com/ | 快速、协作的团队知识库 | | -| 🟢 | PostgreSQL | https://www.postgresql.org/ | 世界上最先进的开源关系数据库 | | -| 🟢 | qBittorrent | https://www.qbittorrent.org/ | qBittorrent 比特流客户端 | | -| 🟢 | QingLong | https://github.com/whyour/qinglong/ | 【青龙】支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台 | | -| 🟢 | Redis | https://redis.io/ | 从世界上最快的内存数据库创建者那里获取该数据库 | | -| 🔴 | Sentinel | https://sentinelguard.io/ | 面向分布式、多语言异构化服务架构的流量治理组件 | | -| 🟢 | SiYuan | https://b3log.org/siyuan/ | 【思源笔记】一款隐私优先、自托管、完全开源的个人知识管理软件 | | -| 🔴 | SpeedTest | https://www.speedtest.net/ | 互联网速度测试 | SpeedTest | -| 🔴 | SpeedTest-Tracker | https://docs.speedtest-tracker.dev/ | Speedtest Tracker 是一款自托管互联网性能跟踪应用程序,可针对 Ookla 的 Speedtest 服务运行速度测试检查 | | -| 🔴 | Stream-Rec | https://github.com/hua0512/stream-rec | Stream-rec是一个用于各种流媒体服务的自动流媒体录制工具 | | -| 🟢 | Transmission | https://transmissionbt.com/ | 快速、简单、免费的 Bittorrent 客户端 | | -| 🟢 | Uptime Kuma | https://uptime.kuma.pet/ | 自托管监控工具 | | -| 🟢 | Umami | https://umami.is/ | 为速度和效率而构建的网站分析 | | -| 🔴 | Yarr | https://github.com/nkanaev/yarr | Rss 阅读器 | | -| 🔴 | Ztncui | https://www.zerotier.com/ | 【自建服务端】ZeroTier 可让您构建几乎任何类型的现代化安全多点虚拟化网络 | ZeroTier | +| 状态 | 图标 | 应用名称 | 应用官网 | 短的描述 | 集合 | +|:--:|:---------------------------------------------------------------------------------------:|:-----------------------:|:-----------------------------------------:|:---------------------------------------------------------------------|:---------:| +| 🟢 | | AList | https://alist.nn.ci/ | 一款支持多重存储的文件列表程序 | | +| 🟢 | | Bark | https://bark.day.app/ | 一款注重隐私、安全可控的自定义通知推送工具 | | +| 🟢 | | Casdoor | https://casdoor.org/ | 身份和访问管理(IAM)/单点登录(SSO)平台 | | +| 🔴 | | Cookie Cloud | https://github.com/easychen/CookieCloud/ | CookieCloud是一个和自架服务器同步浏览器Cookie和LocalStorage的小工具 | | +| 🔴 | | DeepLX | https://deeplx.owo.network/ | DeepL免费API(无需TOKEN) | | +| 🟢 | | Dockge | https://dockge.kuma.pet/ | 面向堆栈的管理器 | | +| 🔴 | | Elasticsearch | https://www.elastic.co/elasticsearch/ | Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎 | Elastic | +| 🔴 | | Kibana | https://www.elastic.co/kibana/ | Kibana 针对大规模数据快速运行数据分析 | Elastic | +| 🟢 | | Emby | https://emby.media/ | Emby Server 是一款个人媒体服务器,可在几乎所有设备上运行应用程序 | | +| 🟢 | | Emby-lovechen | https://emby.media/ | 【开心版】Emby Server 是一款个人媒体服务器,可在几乎所有设备上运行应用程序 | | +| 🟢 | | Gitea | https://gitea.io/ | 私有、快速、可靠的 DevOps 平台 | Gitea | +| 🟢 | | Gitea Runner | https://gitea.io/ | 【Runner】私有、快速、可靠的 DevOps 平台 | Gitea | +| 🟢 | | Halo | https://halo.run/ | 强大易用的开源建站工具 | | +| 🟢 | | Immich | https://immich.app/ | 【完整版本】高性能自托管照片和视频管理解决方案 | Immich | +| 🟢 | | Immich-Server | https://immich.app/ | 【主服务模块】高性能自托管照片和视频管理解决方案 | Immich | +| 🟢 | | Immich-Machine-Learning | https://immich.app/ | 【机器学习模块】高性能自托管照片和视频管理解决方案 | Immich | +| 🟢 | | IYUU Plus | https://doc.iyuu.cn/ | 基于特征码的索引工具 | | +| 🟢 | | Jellyfin | https://jellyfin.org/ | 自由软件媒体系统 | | +| 🔴 | | LinkDing | https://github.com/sissbruecker/linkding/ | 自托管书签管理器 | | +| 🔴 | | MinIO | https://min.io/ | MinIO 是一种高性能、兼容 S3 的对象存储 | | +| 🟢 | | MoviePilot | https://github.com/jxxghp/MoviePilot/ | NAS媒体库自动化管理工具 | | +| 🟢 | | MySQL | https://www.mysql.com/ | 关系数据库管理系统 | MySQL | +| 🟢 | | MariaDB | https://mariadb.org/ | 【MySQL分支】创新的开源数据库 | MySQL | +| 🟢 | | Percona | https://www.percona.com/ | 【MySQL分支】关系数据库管理系统 | MySQL | +| 🔴 | | Nacos | https://nacos.io/ | 动态服务发现、配置管理和服务管理平台 | | +| 🟢 | | NeZha | https://nacos.io/ | 【哪吒监控】开源、轻量、易用的服务器监控、运维工具 | | +| 🟢 | | OneDev | https://onedev.io/ | DevOps 平台、带有 CI/CD、看板和软件包的 Git 服务器 | | +| 🟢 | | OutLine | https://www.getoutline.com/ | 快速、协作的团队知识库 | | +| 🟢 | | PostgreSQL | https://www.postgresql.org/ | 世界上最先进的开源关系数据库 | | +| 🟢 | | qBittorrent | https://www.qbittorrent.org/ | qBittorrent 比特流客户端 | | +| 🟢 | | QingLong | https://github.com/whyour/qinglong/ | 【青龙】支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台 | | +| 🟢 | | Redis | https://redis.io/ | 从世界上最快的内存数据库创建者那里获取该数据库 | | +| 🔴 | | Sentinel | https://sentinelguard.io/ | 面向分布式、多语言异构化服务架构的流量治理组件 | | +| 🟢 | | SiYuan | https://b3log.org/siyuan/ | 【思源笔记】一款隐私优先、自托管、完全开源的个人知识管理软件 | | +| 🔴 | | SpeedTest | https://www.speedtest.net/ | 互联网速度测试 | SpeedTest | +| 🔴 | | SpeedTest-Tracker | https://docs.speedtest-tracker.dev/ | Speedtest Tracker 是一款自托管互联网性能跟踪应用程序,可针对 Ookla 的 Speedtest 服务运行速度测试检查 | | +| 🔴 | | Stream-Rec | https://github.com/hua0512/stream-rec | Stream-rec是一个用于各种流媒体服务的自动流媒体录制工具 | | +| 🟢 | | Transmission | https://transmissionbt.com/ | 快速、简单、免费的 Bittorrent 客户端 | | +| 🟢 | | Uptime Kuma | https://uptime.kuma.pet/ | 自托管监控工具 | | +| 🟢 | | Umami | https://umami.is/ | 为速度和效率而构建的网站分析 | | +| 🔴 | | Yarr | https://github.com/nkanaev/yarr | Rss 阅读器 | | +| 🔴 | | Ztncui | https://www.zerotier.com/ | 【自建服务端】ZeroTier 可让您构建几乎任何类型的现代化安全多点虚拟化网络 | ZeroTier | > 说明: > diff --git a/apps/casdoor/1.645.0/config/init_data.json b/apps/casdoor/1.645.0/config/init_data.json new file mode 100644 index 000000000..a08a677fa --- /dev/null +++ b/apps/casdoor/1.645.0/config/init_data.json @@ -0,0 +1,490 @@ +{ + "organizations": [ + { + "owner": "", + "name": "", + "displayName": "", + "websiteUrl": "", + "favicon": "", + "passwordType": "plain", + "passwordSalt": "", + "passwordOptions": [ + "AtLeast6" + ], + "countryCodes": [ + "US", + "GB", + "ES", + "FR", + "DE", + "CN", + "JP", + "KR", + "VN", + "ID", + "SG", + "IN", + "IT", + "MY", + "TR", + "DZ", + "IL", + "PH", + "NL", + "PL", + "FI", + "SE", + "UA", + "KZ" + ], + "defaultAvatar": "", + "defaultApplication": "", + "tags": [], + "languages": [ + "en", + "zh", + "es", + "fr", + "de", + "id", + "ja", + "ko", + "ru", + "vi", + "it", + "ms", + "tr", + "ar", + "he", + "nl", + "pl", + "fi", + "sv", + "uk", + "kk", + "fa" + ], + "masterPassword": "", + "defaultPassword": "", + "initScore": 2000, + "enableSoftDeletion": false, + "isProfilePublic": true, + "accountItems": [] + } + ], + "applications": [ + { + "owner": "", + "name": "", + "displayName": "", + "logo": "", + "homepageUrl": "", + "organization": "", + "cert": "", + "enablePassword": true, + "enableSignUp": true, + "clientId": "", + "clientSecret": "", + "providers": [ + { + "name": "", + "canSignUp": true, + "canSignIn": true, + "canUnlink": false, + "prompted": false, + "alertType": "None" + } + ], + "signinMethods": [ + { + "name": "Password", + "displayName": "Password", + "rule": "All" + }, + { + "name": "Verification code", + "displayName": "Verification code", + "rule": "All" + }, + { + "name": "WebAuthn", + "displayName": "WebAuthn", + "rule": "None" + }, + { + "name": "Face ID", + "displayName": "Face ID", + "rule": "None" + } + ], + "signupItems": [ + { + "name": "ID", + "visible": false, + "required": true, + "prompted": false, + "rule": "Random" + }, + { + "name": "Username", + "visible": true, + "required": true, + "prompted": false, + "rule": "None" + }, + { + "name": "Display name", + "visible": true, + "required": true, + "prompted": false, + "rule": "None" + }, + { + "name": "Password", + "visible": true, + "required": true, + "prompted": false, + "rule": "None" + }, + { + "name": "Confirm password", + "visible": true, + "required": true, + "prompted": false, + "rule": "None" + }, + { + "name": "Email", + "visible": true, + "required": true, + "prompted": false, + "rule": "None" + }, + { + "name": "Phone", + "visible": true, + "required": true, + "prompted": false, + "rule": "None" + }, + { + "name": "Agreement", + "visible": true, + "required": true, + "prompted": false, + "rule": "None" + } + ], + "grantTypes": [ + "authorization_code", + "password", + "client_credentials", + "token", + "id_token", + "refresh_token" + ], + "redirectUris": [ + "http://localhost:9000/callback" + ], + "tokenFormat": "JWT", + "tokenFields": [], + "expireInHours": 168, + "failedSigninLimit": 5, + "failedSigninFrozenTime": 15 + } + ], + "users": [ + { + "owner": "", + "name": "", + "type": "normal-user", + "password": "", + "displayName": "", + "avatar": "", + "email": "", + "phone": "", + "countryCode": "", + "address": [], + "affiliation": "", + "tag": "", + "score": 2000, + "ranking": 1, + "isAdmin": true, + "isForbidden": false, + "isDeleted": false, + "signupApplication": "", + "createdIp": "", + "groups": [] + } + ], + "providers": [ + { + "owner": "", + "name": "", + "displayName": "", + "category": "", + "type": "" + } + ], + "certs": [ + { + "owner": "", + "name": "", + "displayName": "", + "scope": "JWT", + "type": "x509", + "cryptoAlgorithm": "RS256", + "bitSize": 4096, + "expireInYears": 20, + "certificate": "", + "privateKey": "" + } + ], + "ldaps": [ + { + "id": "", + "owner": "", + "serverName": "", + "host": "", + "port": 389, + "username": "", + "password": "", + "baseDn": "", + "autoSync": 0, + "lastSync": "" + } + ], + "models": [ + { + "owner": "", + "name": "", + "modelText": "", + "displayName": "" + } + ], + "permissions": [ + { + "actions": [], + "displayName": "", + "effect": "", + "isEnabled": true, + "model": "", + "name": "", + "owner": "", + "resourceType": "", + "resources": [], + "roles": [], + "users": [] + } + ], + "payments": [ + { + "currency": "", + "detail": "", + "displayName": "", + "invoiceRemark": "", + "invoiceTaxId": "", + "invoiceTitle": "", + "invoiceType": "", + "invoiceUrl": "", + "message": "", + "name": "", + "organization": "", + "owner": "", + "payUrl": "", + "personEmail": "", + "personIdCard": "", + "personName": "", + "personPhone": "", + "price": 0, + "productDisplayName": "", + "productName": "", + "provider": "", + "returnUrl": "", + "state": "", + "tag": "", + "type": "", + "user": "" + } + ], + "products": [ + { + "currency": "", + "detail": "", + "displayName": "", + "image": "", + "name": "", + "owner": "", + "price": 0, + "providers": [], + "quantity": 0, + "returnUrl": "", + "sold": 0, + "state": "", + "tag": "" + } + ], + "resources": [ + { + "owner": "", + "name": "", + "user": "", + "provider": "", + "application": "", + "tag": "", + "parent": "", + "fileName": "", + "fileType": "", + "fileFormat": "", + "url": "", + "description": "" + } + ], + "roles": [ + { + "displayName": "", + "isEnabled": true, + "name": "", + "owner": "", + "roles": [], + "users": [] + } + ], + "syncers": [ + { + "affiliationTable": "", + "avatarBaseUrl": "", + "database": "", + "databaseType": "", + "errorText": "", + "host": "", + "isEnabled": false, + "name": "", + "organization": "", + "owner": "", + "password": "", + "port": 0, + "syncInterval": 0, + "table": "", + "tableColumns": [ + { + "casdoorName": "", + "isHashed": true, + "name": "", + "type": "", + "values": [] + } + ], + "tablePrimaryKey": "", + "type": "", + "user": "" + } + ], + "tokens": [ + { + "accessToken": "", + "application": "", + "code": "", + "codeChallenge": "", + "codeExpireIn": 0, + "codeIsUsed": true, + "createdTime": "", + "expiresIn": 0, + "name": "", + "organization": "", + "owner": "", + "refreshToken": "", + "scope": "", + "tokenType": "", + "user": "" + } + ], + "webhooks": [ + { + "contentType": "", + "events": [], + "headers": [ + { + "name": "", + "value": "" + } + ], + "isEnabled": true, + "isUserExtended": true, + "method": "", + "name": "", + "organization": "", + "owner": "", + "url": "" + } + ], + "groups": [ + { + "owner": "", + "name": "", + "displayName": "", + "manager": "", + "contactEmail": "", + "type": "", + "parent_id": "", + "isTopGroup": true, + "title": "", + "key": "", + "children": "", + "isEnabled": true + } + ], + "adapters": [ + { + "owner": "", + "name": "", + "table": "", + "useSameDb": true, + "type": "", + "databaseType": "", + "database": "", + "host": "", + "port": 0, + "user": "", + "password": "" + } + ], + "enforcers": [ + { + "owner": "", + "name": "", + "displayName": "", + "description": "", + "model": "", + "adapter": "", + "enforcer": "" + } + ], + "plans": [ + { + "owner": "", + "name": "", + "displayName": "", + "description": "", + "price": 0, + "currency": "", + "period": "", + "product": "", + "paymentProviders": [], + "isEnabled": true, + "role": "" + } + ], + "pricings": [ + { + "owner": "", + "name": "", + "displayName": "", + "description": "", + "plans": [], + "isEnabled": true, + "trialDuration": 0, + "application": "" + } + ] +} diff --git a/apps/casdoor/1.645.0/data.yml b/apps/casdoor/1.645.0/data.yml new file mode 100644 index 000000000..199607eaa --- /dev/null +++ b/apps/casdoor/1.645.0/data.yml @@ -0,0 +1,138 @@ +additionalProperties: + formFields: + - child: + default: "" + envKey: PANEL_DB_HOST + required: true + type: service + default: postgresql + edit: true + envKey: PANEL_DB_TYPE + labelZh: 数据库 服务 (前置检查) + labelEn: Database Service (Pre-check) + required: true + type: apps + values: + - label: PostgreSQL + value: postgresql + - label: MySQL + value: mysql + - label: MariaDB + value: mariadb + - label: Percona + value: percona + - child: + default: "" + envKey: PANEL_REDIS_SERVICE + required: true + type: service + default: redis + envKey: PANEL_REDIS_TYPE + labelZh: Redis 服务 (前置检查) + labelEn: Redis Service (Pre-check) + required: true + type: apps + values: + - label: Redis + value: redis + - default: "/home/casdoor" + edit: true + envKey: CASDOOR_ROOT_PATH + labelZh: 数据持久化路径 + labelEn: Data persistence path + required: true + type: text + - default: 8000 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: WebUI 端口 + labelEn: WebUI port + required: true + rule: paramPort + type: number + - default: postgresql + edit: true + envKey: DB_TYPE + labelZh: 数据库 类型 + labelEn: Database Type + required: true + type: select + values: + - label: PostgreSQL + value: postgresql + - label: MySQL (MariaDB, Percona) + value: mysql + - default: "127.0.0.1" + edit: true + envKey: DB_HOSTNAME + labelZh: 数据库 主机地址 + labelEn: Database Host + required: false + type: text + - default: 5432 + edit: true + envKey: DB_PORT + labelZh: 数据库 端口 + labelEn: Database Port + required: false + rule: paramPort + type: number + - default: "gitea" + edit: true + envKey: DB_USER + labelZh: 数据库 用户名 + labelEn: Database User + required: false + type: text + - default: "" + edit: true + envKey: DB_PASSWD + labelEn: Database Password + labelZh: 数据库 密码 + random: true + required: false + rule: paramComplexity + type: password + - default: "gitea" + edit: true + envKey: DB_NAME + labelZh: 数据库 名称 + labelEn: Database Name + required: false + type: text + - default: "127.0.0.1" + edit: true + envKey: REDIS_HOSTNAME + labelZh: Redis 主机 + labelEn: Redis Host + required: true + type: text + - default: 6379 + edit: true + envKey: REDIS_PORT + labelZh: Redis 端口 + labelEn: Redis Port + required: true + rule: paramPort + type: number + - default: 0 + edit: true + envKey: REDIS_DBINDEX + labelZh: Redis 索引 + labelEn: Redis Index + required: true + type: number + - default: "" + edit: true + envKey: REDIS_PASSWORD + labelZh: Redis 密码 + labelEn: Redis Password + required: false + type: password + - default: "" + edit: true + envKey: socks5Proxy + labelZh: Socks5 代理 (地区网络限制) + labelEn: Socks5 Proxy (Region Network Restriction) + required: false + type: text diff --git a/apps/casdoor/1.645.0/docker-compose.yml b/apps/casdoor/1.645.0/docker-compose.yml new file mode 100644 index 000000000..93ec9bb86 --- /dev/null +++ b/apps/casdoor/1.645.0/docker-compose.yml @@ -0,0 +1,31 @@ +version: "3.8" + +networks: + 1panel-network: + external: true + +services: + casdoor: + image: casbin/casdoor:v1.645.0 + container_name: ${CONTAINER_NAME} + labels: + createdBy: "Apps" + restart: always + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:8000 + build: + context: ./ + dockerfile: Dockerfile + target: STANDARD + entrypoint: /bin/sh -c './server --createDatabase=true' + volumes: + - ${CASDOOR_ROOT_PATH}/data/files:/home/user/casdoor/files + environment: + - driverName=${DB_TYPE} + - dbName=${DB_NAME} + - redisEndpoint=${REDIS_HOSTNAME}:${REDIS_PORT} + - verificationCodeTimeout=10 + - appname="casdoor" + - authState="casdoor" diff --git a/apps/casdoor/1.645.0/scripts/init.sh b/apps/casdoor/1.645.0/scripts/init.sh new file mode 100644 index 000000000..8d37dc472 --- /dev/null +++ b/apps/casdoor/1.645.0/scripts/init.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + + if [ "$DB_TYPE" == "mysql" ]; then + echo "dataSourceName=\"$DB_USER:$DB_PASSWD@tcp($DB_HOSTNAME:$DB_PORT)/\"" >> .env + fi + + if [ "$DB_TYPE" == "postgresql" ]; then + echo "dataSourceName=\"user=$DB_USER password=$DB_PASSWD host=$DB_HOSTNAME port=$DB_PORT sslmode=disable dbname=$DB_NAME\"" >> .env + fi + + if [ -z "$REDIS_PASSWORD" ]; then + echo "redisEndpoint=\"$REDIS_HOSTNAME:$REDIS_PORT,$REDIS_DBINDEX,$REDIS_PASSWORD\"" >> .env + else + echo "redisEndpoint=\"$REDIS_HOSTNAME:$REDIS_PORT,$REDIS_DBINDEX\"" >> .env + fi + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/casdoor/1.645.0/scripts/uninstall.sh b/apps/casdoor/1.645.0/scripts/uninstall.sh new file mode 100644 index 000000000..c86c4fbca --- /dev/null +++ b/apps/casdoor/1.645.0/scripts/uninstall.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/casdoor/1.645.0/scripts/upgrade.sh b/apps/casdoor/1.645.0/scripts/upgrade.sh new file mode 100644 index 000000000..c211154a7 --- /dev/null +++ b/apps/casdoor/1.645.0/scripts/upgrade.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/casdoor/README.md b/apps/casdoor/README.md new file mode 100644 index 000000000..d77dbc7af --- /dev/null +++ b/apps/casdoor/README.md @@ -0,0 +1,81 @@ +# Casdoor + +Casdoor 是一个 UI 优先的身份访问管理 (IAM)/单点登录 (SSO) 平台,其 Web UI 支持 OAuth +2.0、OIDC、SAML、CAS、LDAP、SCIM、WebAuthn、TOTP、MFA、RADIUS、Google Workspace、活动目录和 Kerberos。 + +![Casdoor](https://file.lifebus.top/imgs/casdoor_cover.png) + +## 简介 + +Casdoor是一个基于OAuth 2.0、OIDC、SAML 和 CAS 的,UI-first的身份和访问管理(IAM)/单点登录(SSO)平台。 + +Casdoor是由Casbin社区通过Golang和React进行开发。 + +Casdoor旨在提供一个强大的认证平台来处理用户管理问题。 + ++ ⚡️ 强大的功能和极简的配置。 支持使用 登录和传统的用户名/密码登录,只需几个步骤,Casdoor即可帮助您构建您的用户管理系统。 + ++ 💥 前后端分离架构。 Casdoor提供可随心所欲的网页界面并支持高并发。 + ++ 🥂 活跃的开源社区。 Casdoor是开源的,并有专业团队积极维护中。 + ++ 🌐 多语言支持。 Casdoor支持多种语言,包括中文、英文、法文、以及更多语言。 + +## 特性 + ++ Casdoor 遵循前后端分离架构,采用 Golang 进行开发。 它支持高同步,提供基于网页的用户界面管理,并支持10多种语言的本地化。 + ++ Casdoor 支持第三方应用登录,如 GitHub、谷歌、QQ、微信等,并支持通过插件扩展第三方登录。 + ++ Casdoor 支持基于 Cassbin 的授权管理。 它支持 ACL、RBAC、ABAC 和 RESTful鉴权管理模式。 + ++ Casdoor 提供了手机验证码、电子邮件验证码以及重置密码的功能。 + ++ Casdoor 支持日志的审计和记录。 + ++ Casdoor 可以使用阿里云、腾讯云、七牛云提供的图片CDN云存储功能。 + ++ Casdoor 允许自定义注册、登录以及找回密码页面。 + ++ 通过数据库同步支持与现有系统的集成,从而能够顺利过渡到 Casdoor。 + ++ Casdoor 支持主流数据库: MySQL、PostgreSQL、SQL Server 等, 并支持扩展插件以支持新的数据库。 + +## 安装说明 + +### 数据库支持 + +当前仅支持 `MySQL` 和 `PostgreSQL` 数据库。 + +官方支持使用 'SQLite' 数据库,但不建议在生产环境中使用。因此,我们放弃了 'SQLite' 数据库的配置选项。 + +同时还有一些其他数据库的支持,但是这些数据库的支持并不完善,因此我们也放弃了这些数据库的配置选项。 + +### 存储 `本地文件系统` + +Casdoor 支持将用户头像等文件存储在本地文件系统中。默认情况下,Casdoor 会将文件存储在容器内部 `/home/user/casdoor/files` +目录下。 + +我们将其挂载在 持久化目录 `/home/casdoor` 下,以便于数据的持久化。 + +### `Socks5 代理 (地区网络限制)` 配置 + +如果您的网络环境受到地区网络限制,您可以通过配置 `Socks5 代理` 来解决这个问题。 + +socks5Proxy 是 SOCKS 代理服务器 IP 地址。 +设置代理端口,因为我们有与Google相关的服务,或者使用Google、GitHub、Facebook、LinkedIn或Steam作为OAuth提供商,这在某些地区可能会受到网络限制。 + +### 数据初始化 `init_data.json` 配置 + +Casdoor 会在第一次启动时,自动初始化数据库。您可以通过配置 `init_data.json` 文件来初始化数据库。 + +配置自定义的 `init_data.json` 文件,需要挂载到容器中。 + +需要修改 `docker-compose.yml` 文件中的 `volumes` 部分,添加自定义配置的挂载,将 `init_data.json` 文件挂载到容器中,覆盖默认配置。 + +```yaml +volumes: + - ./config/init_data.json:/init_data.json +``` + +其中 `./config/init_data.json` 为默认配置文件所在路径,您可以根据实际情况进行修改为自定义绝对文件路径即可。 diff --git a/apps/casdoor/data.yml b/apps/casdoor/data.yml new file mode 100644 index 000000000..59c536eb1 --- /dev/null +++ b/apps/casdoor/data.yml @@ -0,0 +1,19 @@ +name: Casdoor +title: 身份和访问管理(IAM)/单点登录(SSO)平台 +description: 身份和访问管理(IAM)/单点登录(SSO)平台 +additionalProperties: + key: casdoor + name: Casdoor + tags: + - WebSite + - Middleware + - Tool + - Local + shortDescZh: 身份和访问管理(IAM)/单点登录(SSO)平台 + shortDescEn: Identity and Access Management (IAM)/Single Sign-On (SSO) platform + type: website + crossVersionUpdate: true + limit: 0 + website: https://casdoor.org/ + github: https://github.com/casdoor/casdoor/ + document: https://casdoor.org/zh/docs/overview/ diff --git a/apps/casdoor/logo.png b/apps/casdoor/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..211148377989a895019f6d1082778aa9ec630fc8 GIT binary patch literal 38624 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 literal 0 HcmV?d00001 diff --git a/envs/casdoor/casdoor.env b/envs/casdoor/casdoor.env new file mode 100644 index 000000000..70eaeccc5 --- /dev/null +++ b/envs/casdoor/casdoor.env @@ -0,0 +1,31 @@ +appname = casdoor +httpport = 8000 +runmode = prod +copyrequestbody = true +driverName = mysql +dataSourceName = root:123456@tcp(localhost:3306)/ +dbName = casdoor +tableNamePrefix = +showSql = false +redisEndpoint = +defaultStorageProvider = +isCloudIntranet = false +authState = "casdoor" +socks5Proxy = "127.0.0.1:10808" +verificationCodeTimeout = 10 +initScore = 0 +logPostOnly = true +isUsernameLowered = false +origin = +originFrontend = +staticBaseUrl = "https://cdn.casbin.org" +isDemoMode = false +batchSize = 100 +enableGzip = true +ldapServerPort = 389 +radiusServerPort = 1812 +radiusSecret = "secret" +quota = {"organization": -1, "user": -1, "application": -1, "provider": -1} +logConfig = {"filename": "logs/casdoor.log", "maxdays":99999, "perm":"0770"} +initDataFile = "./init_data.json" +frontendBaseDir = "../casdoor"