diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 6d5d3b3..cb10679 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -58,6 +58,7 @@ organization = Organization
mirror = Mirror
issue_milestone = Milestone
new_repo = New Repository
+new_repo_from_template=Create from Template
new_migrate = New Migration
new_mirror = New Mirror
new_fork = New Repository Fork
@@ -4003,4 +4004,4 @@ validation_error = Configuration validation error
required_field = Required field
invalid_value = Invalid value
out_of_range = Out of range
-invalid_format = Invalid format
\ No newline at end of file
+invalid_format = Invalid format
diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini
index e59c1e7..c39d89a 100644
--- a/options/locale/locale_zh-CN.ini
+++ b/options/locale/locale_zh-CN.ini
@@ -56,6 +56,7 @@ organization=组织
mirror=镜像
issue_milestone=里程碑
new_repo=创建仓库
+new_repo_from_template=从模板创建仓库
new_migrate=迁移外部仓库
new_mirror=创建新的镜像
new_fork=派生新仓库
@@ -3990,4 +3991,4 @@ validation_error=配置验证错误
required_field=必填字段
invalid_value=无效值
out_of_range=超出范围
-invalid_format=格式无效
\ No newline at end of file
+invalid_format=格式无效
diff --git a/services/appstore/examples/mengningsoftware.json b/services/appstore/examples/mengningsoftware.json
new file mode 100644
index 0000000..b6946c9
--- /dev/null
+++ b/services/appstore/examples/mengningsoftware.json
@@ -0,0 +1,134 @@
+{
+ "id": "mnsoftware",
+ "name": "Mengningsoftware",
+ "description": "High-performance HTTP server and reverse proxy",
+ "category": "web-server",
+ "tags": ["web", "proxy", "http", "server"],
+ "icon": "https://www.mengning.com.cn/assets/images/mengninglogo.png",
+ "author": "Mengningsoftware Inc",
+ "website": "https://www.mengning.com.cn/",
+ "repository": "https://devstar.cn/lat5211/devstar_introduction.git",
+ "license": "BSD-2-Clause",
+ "version": "1.0.0",
+ "deployment_type": "both",
+ "config": {
+ "schema": {
+ "port": {
+ "type": "int",
+ "description": "Port number for the web server",
+ "required": true,
+ "min": 1,
+ "max": 65535,
+ "placeholder": "Enter port number"
+ },
+ "server_name": {
+ "type": "string",
+ "description": "Server name for virtual host",
+ "required": false,
+ "pattern": "^[a-zA-Z0-9.-]+$",
+ "placeholder": "Enter server name"
+ },
+ "ssl_enabled": {
+ "type": "bool",
+ "description": "Enable SSL/TLS support",
+ "required": false,
+ "help": "Enable HTTPS support"
+ },
+ "log_level": {
+ "type": "select",
+ "description": "Logging level",
+ "required": false,
+ "options": ["debug", "info", "warn", "error"]
+ }
+ },
+ "default": {
+ "port": 80,
+ "server_name": "localhost",
+ "ssl_enabled": false,
+ "log_level": "info"
+ }
+ },
+ "requirements": {
+ "min_memory": "128MB",
+ "min_cpu": "1 core",
+ "min_storage": "100MB",
+ "os": "linux",
+ "arch": "x86_64"
+ },
+ "deploy": {
+ "type": "docker",
+ "docker": {
+ "image": "crpi-pqfsp88s5zx2zwfq.cn-hangzhou.personal.cr.aliyuncs.com/devstar/devstar_introduction",
+ "tag": "1.24.0",
+ "ports": [
+ {
+ "host_port": 80,
+ "container_port": 80,
+ "protocol": "tcp",
+ "name": "http"
+ },
+ {
+ "host_port": 443,
+ "container_port": 443,
+ "protocol": "tcp",
+ "name": "https"
+ }
+ ],
+ "volumes": [
+ {
+ "host_path": "/var/log/nginx",
+ "container_path": "/var/log/nginx",
+ "type": "bind"
+ },
+ {
+ "host_path": "/etc/nginx/conf.d",
+ "container_path": "/etc/nginx/conf.d",
+ "type": "bind"
+ }
+ ],
+ "environment": {
+ "NGINX_VERSION": "1.24.0"
+ },
+ "resources": {
+ "cpu": "500m",
+ "memory": "512Mi"
+ }
+ },
+ "kubernetes": {
+ "namespace": "web-servers",
+ "replicas": 2,
+ "image": "crpi-pqfsp88s5zx2zwfq.cn-hangzhou.personal.cr.aliyuncs.com/devstar/devstar_introduction",
+ "tag": "1.24.0",
+ "ports": [
+ {
+ "container_port": 80,
+ "protocol": "tcp",
+ "name": "http"
+ }
+ ],
+ "volumes": [
+ {
+ "container_path": "/var/log/nginx",
+ "type": "emptyDir"
+ }
+ ],
+ "environment": {
+ "NGINX_VERSION": "1.24.0"
+ },
+ "resources": {
+ "cpu": "500m",
+ "memory": "512Mi"
+ },
+ "service": {
+ "type": "ClusterIP",
+ "ports": [
+ {
+ "container_port": 80,
+ "protocol": "tcp",
+ "name": "http"
+ }
+ ]
+ }
+ }
+ }
+}
diff --git a/templates/base/head_navbar.tmpl b/templates/base/head_navbar.tmpl
index d2ffce6..b35a98a 100644
--- a/templates/base/head_navbar.tmpl
+++ b/templates/base/head_navbar.tmpl
@@ -73,6 +73,9 @@
{{svg "octicon-plus"}} {{ctx.Locale.Tr "new_repo"}}
+
+ {{svg "octicon-plus-circle"}} {{ctx.Locale.Tr "new_repo_from_template"}}
+
{{if not .DisableMigrations}}
{{svg "octicon-repo-push"}} {{ctx.Locale.Tr "new_migrate"}}
diff --git a/web_src/js/svg.ts b/web_src/js/svg.ts
index 50c9536..16fd2b1 100644
--- a/web_src/js/svg.ts
+++ b/web_src/js/svg.ts
@@ -57,6 +57,7 @@ import octiconMirror from '../../public/assets/img/svg/octicon-mirror.svg';
import octiconOrganization from '../../public/assets/img/svg/octicon-organization.svg';
import octiconPlay from '../../public/assets/img/svg/octicon-play.svg';
import octiconPlus from '../../public/assets/img/svg/octicon-plus.svg';
+import octiconPlusCircle from '../../public/assets/img/svg/octicon-plus-circle.svg';
import octiconProject from '../../public/assets/img/svg/octicon-project.svg';
import octiconQuote from '../../public/assets/img/svg/octicon-quote.svg';
import octiconRepo from '../../public/assets/img/svg/octicon-repo.svg';
@@ -136,6 +137,7 @@ const svgs = {
'octicon-organization': octiconOrganization,
'octicon-play': octiconPlay,
'octicon-plus': octiconPlus,
+ 'octicon-plus-circle': octiconPlusCircle,
'octicon-project': octiconProject,
'octicon-quote': octiconQuote,
'octicon-repo': octiconRepo,