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 7f53d3a6..fa5a9907 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 00000000..a08a677f --- /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 00000000..199607ea --- /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 00000000..93ec9bb8 --- /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 00000000..8d37dc47 --- /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 00000000..c86c4fbc --- /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 00000000..c211154a --- /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 00000000..d77dbc7a --- /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 00000000..59c536eb --- /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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