diff --git a/act_runner/data.yml b/act_runner/data.yml index 6f9ae75..82847ac 100644 --- a/act_runner/data.yml +++ b/act_runner/data.yml @@ -2,7 +2,7 @@ name: en: Act Runner zh_CN: Act Runner zh_TW: Act Runner -tags: +categories: - devops description: en: A runner for Gitea based on act diff --git a/adguardhome/data.yml b/adguardhome/data.yml index 3518919..76d3247 100755 --- a/adguardhome/data.yml +++ b/adguardhome/data.yml @@ -2,7 +2,7 @@ name: en: AdGuard Home zh_CN: AdGuard Home zh_TW: AdGuard Home -tags: +categories: - tool - safe description: diff --git a/certd/data.yml b/certd/data.yml index cf341d2..0a3f0e7 100755 --- a/certd/data.yml +++ b/certd/data.yml @@ -2,7 +2,7 @@ name: en: Certd zh_CN: Certd zh_TW: Certd -tags: +categories: - tool - devops description: diff --git a/certimate/data.yml b/certimate/data.yml index 76e60af..31cc396 100755 --- a/certimate/data.yml +++ b/certimate/data.yml @@ -2,7 +2,7 @@ name: en: Certimate zh_CN: Certimate zh_TW: Certimate -tags: +categories: - tool - devops description: diff --git a/dnsmgr/data.yml b/dnsmgr/data.yml new file mode 100755 index 0000000..1489d28 --- /dev/null +++ b/dnsmgr/data.yml @@ -0,0 +1,22 @@ +name: + en: Rainbow Aggregated DNSMgr + zh_CN: 彩虹聚合 DNS 管理系统 + zh_TW: 彩虹聚合 DNS 管理系統 +categories: + - tool + - devops +description: + en: Multi-platform DNS management system with failover switching and SSL certificate automation + zh_CN: 多平台 DNS 聚合管理系统,支持容灾切换和 SSL 证书自动化 + zh_TW: 多平台 DNS 聚合管理系統,支援容災切換和 SSL 證書自動化 +website: https://github.com/netcccyun/dnsmgr +architectures: + - amd64 +environments: + DNSMGR_PORT_HTTP: + description: + en: HTTP Port + zh_CN: HTTP 端口 + zh_TW: HTTP 埠 + type: port + default: 8081 diff --git a/dnsmgr/docker-compose.yml b/dnsmgr/docker-compose.yml new file mode 100644 index 0000000..1c84ea8 --- /dev/null +++ b/dnsmgr/docker-compose.yml @@ -0,0 +1,14 @@ +services: + dnsmgr: + image: netcccyun/dnsmgr:latest + restart: always + networks: + - acepanel-network + volumes: + - ./data:/app/www + ports: + - ${DNSMGR_PORT_HTTP}:80 + +networks: + acepanel-network: + external: true diff --git a/dnsmgr/logo.png b/dnsmgr/logo.png new file mode 100644 index 0000000..f5f7b5e Binary files /dev/null and b/dnsmgr/logo.png differ diff --git a/elasticsearch/data.yml b/elasticsearch/data.yml index 7a7dac9..f3a9b94 100755 --- a/elasticsearch/data.yml +++ b/elasticsearch/data.yml @@ -2,7 +2,7 @@ name: en: Elasticsearch zh_CN: Elasticsearch zh_TW: Elasticsearch -tags: +categories: - middleware - database description: @@ -29,10 +29,8 @@ environments: type: select default: "true" options: - - label: "True" - value: "true" - - label: "False" - value: "false" + "True": "true" + "False": "false" ELASTICSEARCH_PASSWORD: description: en: Password diff --git a/gatus/data.yml b/gatus/data.yml index 4fe0c1c..4d3006c 100755 --- a/gatus/data.yml +++ b/gatus/data.yml @@ -2,7 +2,7 @@ name: en: Gatus zh_CN: Gatus zh_TW: Gatus -tags: +categories: - monitor - tool description: diff --git a/gitlab/data.yml b/gitlab/data.yml index 34dd20e..7bbfe79 100755 --- a/gitlab/data.yml +++ b/gitlab/data.yml @@ -2,7 +2,7 @@ name: en: GitLab zh_CN: GitLab zh_TW: GitLab -tags: +categories: - devops description: en: Complete DevOps platform with version control, CI/CD, and project management diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..0043c68 --- /dev/null +++ b/go.mod @@ -0,0 +1,10 @@ +module acepanel-templates + +go 1.25.5 + +require ( + github.com/go-resty/resty/v2 v2.17.1 + go.yaml.in/yaml/v4 v4.0.0-rc.3 +) + +require golang.org/x/net v0.43.0 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..04f5c1d --- /dev/null +++ b/go.sum @@ -0,0 +1,8 @@ +github.com/go-resty/resty/v2 v2.17.1 h1:x3aMpHK1YM9e4va/TMDRlusDDoZiQ+ViDu/WpA6xTM4= +github.com/go-resty/resty/v2 v2.17.1/go.mod h1:kCKZ3wWmwJaNc7S29BRtUhJwy7iqmn+2mLtQrOyQlVA= +go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= +go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= +golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= diff --git a/grafana/data.yml b/grafana/data.yml index afebda2..a56e4e4 100755 --- a/grafana/data.yml +++ b/grafana/data.yml @@ -2,7 +2,7 @@ name: en: Grafana zh_CN: Grafana zh_TW: Grafana -tags: +categories: - monitor - tool description: diff --git a/home-assistant/data.yml b/home-assistant/data.yml index 9f6260c..136d680 100755 --- a/home-assistant/data.yml +++ b/home-assistant/data.yml @@ -2,7 +2,7 @@ name: en: Home Assistant zh_CN: Home Assistant zh_TW: Home Assistant -tags: +categories: - ai - tool description: diff --git a/koishi/data.yml b/koishi/data.yml index 24bda47..1342e65 100755 --- a/koishi/data.yml +++ b/koishi/data.yml @@ -2,7 +2,7 @@ name: en: Koishi zh_CN: Koishi zh_TW: Koishi -tags: +categories: - tool description: en: Cross-platform high-performance chatbot framework diff --git a/lobe-chat/data.yml b/lobe-chat/data.yml index 194337f..23805d7 100755 --- a/lobe-chat/data.yml +++ b/lobe-chat/data.yml @@ -2,7 +2,7 @@ name: en: LobeChat zh_CN: LobeChat zh_TW: LobeChat -tags: +categories: - ai - tool description: diff --git a/lsky-pro/data.yml b/lsky-pro/data.yml index acbb57d..0715b88 100755 --- a/lsky-pro/data.yml +++ b/lsky-pro/data.yml @@ -2,7 +2,7 @@ name: en: Lsky Pro zh_CN: Lsky Pro zh_TW: Lsky Pro -tags: +categories: - storage - tool description: diff --git a/main.go b/main.go new file mode 100644 index 0000000..c81d55d --- /dev/null +++ b/main.go @@ -0,0 +1,167 @@ +package main + +import ( + "encoding/base64" + "encoding/json" + "fmt" + "os" + "path/filepath" + + "github.com/go-resty/resty/v2" + "go.yaml.in/yaml/v4" +) + +const ( + apiURL = "https://api.acepanel.net/template/import" + batchSize = 10 +) + +func main() { + apiKey := os.Getenv("API_KEY") + if apiKey == "" { + fmt.Println("Error: API_KEY environment variable is not set") + os.Exit(1) + } + + // Get current working directory + cwd, err := os.Getwd() + if err != nil { + fmt.Printf("Error getting current directory: %v\n", err) + os.Exit(1) + } + + // Find all data.yml files + var templates []map[string]any + entries, err := os.ReadDir(cwd) + if err != nil { + fmt.Printf("Error reading directory: %v\n", err) + os.Exit(1) + } + + for _, entry := range entries { + if !entry.IsDir() { + continue + } + + dataPath := filepath.Join(cwd, entry.Name(), "data.yml") + if _, err := os.Stat(dataPath); os.IsNotExist(err) { + continue + } + + // Read and parse data.yml + data, err := os.ReadFile(dataPath) + if err != nil { + fmt.Printf("Error reading %s: %v\n", dataPath, err) + continue + } + + var template map[string]any + if err := yaml.Unmarshal(data, &template); err != nil { + fmt.Printf("Error parsing %s: %v\n", dataPath, err) + continue + } + + // Add directory name as template slug + template["slug"] = entry.Name() + + // Convert environments from map to array format + // From: {ENV_NAME: {description: xxx, type: xxx, default: xxx}} + // To: [{name: ENV_NAME, description: xxx, type: xxx, default: xxx}] + if envMap, ok := template["environments"].(map[string]any); ok { + envArray := make([]map[string]any, 0, len(envMap)) + for name, value := range envMap { + if envValue, ok := value.(map[string]any); ok { + envItem := map[string]any{"name": name} + for k, v := range envValue { + envItem[k] = v + } + envArray = append(envArray, envItem) + } + } + template["environments"] = envArray + } + + // Read docker-compose.yml + composePath := filepath.Join(cwd, entry.Name(), "docker-compose.yml") + composeData, err := os.ReadFile(composePath) + if err != nil { + fmt.Printf("Error reading docker-compose.yml for %s: %v\n", entry.Name(), err) + continue + } + template["compose"] = string(composeData) + + // Read and encode logo (check svg first, then png) + var logoPath string + var logoMime string + svgPath := filepath.Join(cwd, entry.Name(), "logo.svg") + pngPath := filepath.Join(cwd, entry.Name(), "logo.png") + + if _, err := os.Stat(svgPath); err == nil { + logoPath = svgPath + logoMime = "image/svg+xml" + } else if _, err := os.Stat(pngPath); err == nil { + logoPath = pngPath + logoMime = "image/png" + } + + if logoPath != "" { + logoData, err := os.ReadFile(logoPath) + if err != nil { + fmt.Printf("Error reading logo for %s: %v\n", entry.Name(), err) + } else { + template["icon"] = "data:" + logoMime + ";base64," + base64.StdEncoding.EncodeToString(logoData) + } + } + + templates = append(templates, template) + fmt.Printf("Loaded template: %s\n", entry.Name()) + } + + fmt.Printf("\nTotal templates loaded: %d\n", len(templates)) + + if len(templates) == 0 { + fmt.Println("No templates found") + return + } + + // Send templates in batches + client := resty.New() + totalBatches := (len(templates) + batchSize - 1) / batchSize + + for i := 0; i < len(templates); i += batchSize { + end := i + batchSize + if end > len(templates) { + end = len(templates) + } + + batch := templates[i:end] + batchNum := i/batchSize + 1 + + jsonData, err := json.Marshal(batch) + if err != nil { + fmt.Printf("Error marshaling batch %d: %v\n", batchNum, err) + continue + } + + fmt.Printf("\nSending batch %d/%d (%d templates)...\n", batchNum, totalBatches, len(batch)) + + resp, err := client.R(). + SetHeader("Content-Type", "application/json"). + SetHeader("X-API-KEY", apiKey). + SetBody(jsonData). + Post(apiURL) + + if err != nil { + fmt.Printf("Error sending batch %d: %v\n", batchNum, err) + continue + } + + if resp.IsSuccess() { + fmt.Printf("Batch %d sent successfully (status: %d)\n", batchNum, resp.StatusCode()) + } else { + fmt.Printf("Batch %d failed (status: %d): %s\n", batchNum, resp.StatusCode(), resp.String()) + } + } + + fmt.Println("\nImport completed!") +} diff --git a/mariadb/data.yml b/mariadb/data.yml index 1540390..13bbe19 100755 --- a/mariadb/data.yml +++ b/mariadb/data.yml @@ -2,7 +2,7 @@ name: en: MariaDB zh_CN: MariaDB zh_TW: MariaDB -tags: +categories: - database description: en: Open source relational database, MySQL fork diff --git a/mliev-dwz/data.yml b/mliev-dwz/data.yml index ad69e79..1df7203 100755 --- a/mliev-dwz/data.yml +++ b/mliev-dwz/data.yml @@ -1,8 +1,8 @@ name: en: Mliev DWZ - zh_CN: Mliev DWZ - zh_TW: Mliev DWZ -tags: + zh_CN: 木雷坞短网址 + zh_TW: 木雷坞短鏈接 +categories: - tool description: en: Enterprise-level URL shortener service platform @@ -35,10 +35,8 @@ environments: type: apps default: mysql options: - - label: MySQL - value: mysql - - label: PostgreSQL - value: postgres + "MySQL": "mysql" + "PostgreSQL": "postgres" MLIEV_DWZ_DB_HOST: description: en: Database Host diff --git a/mssql/data.yml b/mssql/data.yml index ec750cf..cbba6d6 100755 --- a/mssql/data.yml +++ b/mssql/data.yml @@ -2,7 +2,7 @@ name: en: MS SQL Server zh_CN: MS SQL Server zh_TW: MS SQL Server -tags: +categories: - database description: en: Microsoft SQL Server relational database diff --git a/mysql/data.yml b/mysql/data.yml index ce2234f..321c0e6 100755 --- a/mysql/data.yml +++ b/mysql/data.yml @@ -2,7 +2,7 @@ name: en: MySQL zh_CN: MySQL zh_TW: MySQL -tags: +categories: - database description: en: World's most popular open source relational database diff --git a/nacos/data.yml b/nacos/data.yml index 93171ac..858c9ea 100755 --- a/nacos/data.yml +++ b/nacos/data.yml @@ -2,7 +2,7 @@ name: en: Nacos zh_CN: Nacos zh_TW: Nacos -tags: +categories: - middleware - devops description: @@ -78,10 +78,8 @@ environments: type: select default: "FALSE" options: - - label: "TRUE" - value: "TRUE" - - label: "FALSE" - value: "FALSE" + "True": "TRUE" + "False": "FALSE" NACOS_AUTH_IDENTITY_KEY: description: en: Auth Identity Key diff --git a/new-api/data.yml b/new-api/data.yml index bf27caf..833e456 100755 --- a/new-api/data.yml +++ b/new-api/data.yml @@ -2,7 +2,7 @@ name: en: New API zh_CN: New API zh_TW: New API -tags: +categories: - ai - tool description: diff --git a/nextcloud/data.yml b/nextcloud/data.yml index 6adb902..2f14c29 100755 --- a/nextcloud/data.yml +++ b/nextcloud/data.yml @@ -2,7 +2,7 @@ name: en: Nextcloud zh_CN: Nextcloud zh_TW: Nextcloud -tags: +categories: - storage - tool description: diff --git a/nezha/data.yml b/nezha/data.yml index 591c683..491bae3 100755 --- a/nezha/data.yml +++ b/nezha/data.yml @@ -2,7 +2,7 @@ name: en: Nezha zh_CN: 哪吒监控 zh_TW: 哪吒監控 -tags: +categories: - monitor - tool description: diff --git a/ollama/data.yml b/ollama/data.yml index ee5823f..050d94c 100755 --- a/ollama/data.yml +++ b/ollama/data.yml @@ -2,7 +2,7 @@ name: en: Ollama zh_CN: Ollama zh_TW: Ollama -tags: +categories: - ai - tool description: diff --git a/one-api/data.yml b/one-api/data.yml index d366640..76fcff3 100755 --- a/one-api/data.yml +++ b/one-api/data.yml @@ -2,7 +2,7 @@ name: en: One API zh_CN: One API zh_TW: One API -tags: +categories: - ai - tool description: diff --git a/openlist/data.yml b/openlist/data.yml index 073f505..87149c1 100755 --- a/openlist/data.yml +++ b/openlist/data.yml @@ -2,7 +2,7 @@ name: en: OpenList zh_CN: OpenList zh_TW: OpenList -tags: +categories: - storage - tool description: diff --git a/pg4admin/data.yml b/pg4admin/data.yml index ab3a9dc..cbca004 100644 --- a/pg4admin/data.yml +++ b/pg4admin/data.yml @@ -2,7 +2,7 @@ name: en: pgAdmin 4 zh_CN: pgAdmin 4 zh_TW: pgAdmin 4 -tags: +categories: - tool description: en: PostgreSQL management and development platform diff --git a/postgresql/data.yml b/postgresql/data.yml index 7982003..ce81f72 100755 --- a/postgresql/data.yml +++ b/postgresql/data.yml @@ -2,7 +2,7 @@ name: en: PostgreSQL zh_CN: PostgreSQL zh_TW: PostgreSQL -tags: +categories: - database description: en: Powerful open source object-relational database system diff --git a/prometheus/data.yml b/prometheus/data.yml index 5371f8e..aa077a0 100755 --- a/prometheus/data.yml +++ b/prometheus/data.yml @@ -2,7 +2,7 @@ name: en: Prometheus zh_CN: Prometheus zh_TW: Prometheus -tags: +categories: - monitor description: en: Open source monitoring and alerting toolkit diff --git a/qinglong/data.yml b/qinglong/data.yml index 52b006f..e2ee517 100755 --- a/qinglong/data.yml +++ b/qinglong/data.yml @@ -2,7 +2,7 @@ name: en: Qinglong zh_CN: 青龙 zh_TW: 青龍 -tags: +categories: - tool description: en: Scheduled task management platform diff --git a/rabbitmq/data.yml b/rabbitmq/data.yml index 3900769..f6883bb 100755 --- a/rabbitmq/data.yml +++ b/rabbitmq/data.yml @@ -2,7 +2,7 @@ name: en: RabbitMQ zh_CN: RabbitMQ zh_TW: RabbitMQ -tags: +categories: - middleware description: en: Feature-rich multi-protocol messaging broker diff --git a/redis/data.yml b/redis/data.yml index b6b3f0e..e791d82 100755 --- a/redis/data.yml +++ b/redis/data.yml @@ -2,7 +2,7 @@ name: en: Redis zh_CN: Redis zh_TW: Redis -tags: +categories: - database - middleware description: diff --git a/rocketmq/data.yml b/rocketmq/data.yml index ae8b4bf..ff97b05 100755 --- a/rocketmq/data.yml +++ b/rocketmq/data.yml @@ -2,7 +2,7 @@ name: en: RocketMQ zh_CN: RocketMQ zh_TW: RocketMQ -tags: +categories: - middleware description: en: Cloud-native messaging and streaming platform diff --git a/rustdesk/data.yml b/rustdesk/data.yml index 0dde38c..5ba47ff 100755 --- a/rustdesk/data.yml +++ b/rustdesk/data.yml @@ -2,7 +2,7 @@ name: en: RustDesk zh_CN: RustDesk zh_TW: RustDesk -tags: +categories: - tool - game description: diff --git a/rustfs/data.yml b/rustfs/data.yml index b4f3538..2f51874 100755 --- a/rustfs/data.yml +++ b/rustfs/data.yml @@ -2,7 +2,7 @@ name: en: RustFS zh_CN: RustFS zh_TW: RustFS -tags: +categories: - middleware - storage description: @@ -50,7 +50,5 @@ environments: type: select default: "true" options: - - label: "True" - value: "true" - - label: "False" - value: "false" + "True": "true" + "False": "false" diff --git a/tomcat/data.yml b/tomcat/data.yml index ff16fd8..a70071d 100755 --- a/tomcat/data.yml +++ b/tomcat/data.yml @@ -2,7 +2,7 @@ name: en: Apache Tomcat zh_CN: Apache Tomcat zh_TW: Apache Tomcat -tags: +categories: - middleware description: en: Open source Java Servlet container and web server diff --git a/umami/data.yml b/umami/data.yml index e3df3a0..d295728 100755 --- a/umami/data.yml +++ b/umami/data.yml @@ -2,7 +2,7 @@ name: en: Umami zh_CN: Umami zh_TW: Umami -tags: +categories: - tool - monitor description: @@ -29,10 +29,8 @@ environments: type: select default: postgresql options: - - label: MySQL - value: mysql - - label: PostgreSQL - value: postgresql + "MySQL": "mysql" + "PostgreSQL": "postgresql" UMAMI_DB_HOST: description: en: Database Host diff --git a/uptime-kuma/data.yml b/uptime-kuma/data.yml index 48db9dd..c1d7154 100755 --- a/uptime-kuma/data.yml +++ b/uptime-kuma/data.yml @@ -2,7 +2,7 @@ name: en: Uptime Kuma zh_CN: Uptime Kuma zh_TW: Uptime Kuma -tags: +categories: - tool - devops description: diff --git a/vaultwarden/data.yml b/vaultwarden/data.yml index 823bf7d..736b5c1 100755 --- a/vaultwarden/data.yml +++ b/vaultwarden/data.yml @@ -2,7 +2,7 @@ name: en: Vaultwarden zh_CN: Vaultwarden zh_TW: Vaultwarden -tags: +categories: - tool - safe description: diff --git a/watchtower/data.yml b/watchtower/data.yml index fd75cb9..86989c3 100755 --- a/watchtower/data.yml +++ b/watchtower/data.yml @@ -2,7 +2,7 @@ name: en: Watchtower zh_CN: Watchtower zh_TW: Watchtower -tags: +categories: - tool - devops description: diff --git a/windows/data.yml b/windows/data.yml index fe1ad24..6d9cc69 100755 --- a/windows/data.yml +++ b/windows/data.yml @@ -2,7 +2,7 @@ name: en: Windows zh_CN: Windows zh_TW: Windows -tags: +categories: - tool description: en: Run Windows in Docker container with KVM acceleration