From 5855e9b0d8f0cc772c500f4639d1dc4712bf5b68 Mon Sep 17 00:00:00 2001 From: zhengkunwang223 Date: Tue, 27 Sep 2022 22:53:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0Nginx=E5=BA=94?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/icons/mysql.png | Bin 0 -> 3761 bytes apps/icons/nginx.png | Bin 0 -> 2411 bytes apps/icons/redis.png | Bin 0 -> 26758 bytes apps/list.json | 15 +++++++++ apps/mysql/5.7.39/docker-compose.yml | 1 + apps/mysql/8.0.30/docker-compose.yml | 1 + apps/nginx/1.23.1/conf/conf.d/default.conf | 0 apps/nginx/1.23.1/conf/nginx.conf | 29 ++++++++++++++++++ apps/nginx/1.23.1/docker-compose.yml | 13 ++++++++ apps/nginx/1.23.1/html/index.html | 1 + apps/nginx/1.23.1/params.json | 12 ++++++++ backend/app/service/app.go | 5 ++- backend/go.mod | 4 +-- backend/go.sum | 2 -- .../src/views/app-store/detail/install.vue | 2 +- frontend/src/views/app-store/index.vue | 12 +++++--- .../src/views/login/components/login-form.vue | 4 +-- 17 files changed, 86 insertions(+), 15 deletions(-) create mode 100644 apps/icons/mysql.png create mode 100644 apps/icons/nginx.png create mode 100644 apps/icons/redis.png create mode 100644 apps/nginx/1.23.1/conf/conf.d/default.conf create mode 100644 apps/nginx/1.23.1/conf/nginx.conf create mode 100644 apps/nginx/1.23.1/docker-compose.yml create mode 100644 apps/nginx/1.23.1/html/index.html create mode 100644 apps/nginx/1.23.1/params.json diff --git a/apps/icons/mysql.png b/apps/icons/mysql.png new file mode 100644 index 0000000000000000000000000000000000000000..73b55bd0d517dcba53c878712544abf96be3a66e GIT binary patch literal 3761 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 literal 0 HcmV?d00001 diff --git a/apps/icons/redis.png b/apps/icons/redis.png new file mode 100644 index 0000000000000000000000000000000000000000..ec818fdfda63a398e1061a7b2855a63beaf9134f GIT binary patch literal 26758 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 R9YnzIs-~Vsg_`aC{{aPGhBE*F literal 0 HcmV?d00001 diff --git a/apps/list.json b/apps/list.json index 78fd12ee0..3a9606162 100644 --- a/apps/list.json +++ b/apps/list.json @@ -5,6 +5,10 @@ "key": "WebSite", "name": "网站" }, + { + "key": "Server", + "name": "服务器" + }, { "key": "Datastore", "name": "数据库" @@ -21,6 +25,17 @@ "author": "Oracle", "type": "internal", "source": "https://www.mysql.com" + }, + { + "key": "nginx", + "name": "Nginx", + "tags": ["Server"], + "versions": ["1.23.1"], + "short_desc": "高性能的HTTP和反向代理web服务器", + "icon": "nginx.png", + "author": "Nginx", + "type": "internal", + "source": "http://nginx.org/" } ] } \ No newline at end of file diff --git a/apps/mysql/5.7.39/docker-compose.yml b/apps/mysql/5.7.39/docker-compose.yml index c1910556e..9f9be00a0 100644 --- a/apps/mysql/5.7.39/docker-compose.yml +++ b/apps/mysql/5.7.39/docker-compose.yml @@ -16,6 +16,7 @@ services: volumes: - ./data/:/var/lib/mysql - ./conf/my.cnf:/etc/mysql/my.cnf + - ./log:/var/log/mysql command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci diff --git a/apps/mysql/8.0.30/docker-compose.yml b/apps/mysql/8.0.30/docker-compose.yml index 28ec6574c..4d1780665 100644 --- a/apps/mysql/8.0.30/docker-compose.yml +++ b/apps/mysql/8.0.30/docker-compose.yml @@ -16,6 +16,7 @@ services: volumes: - ./data/:/var/lib/mysql - ./conf/my.cnf:/etc/mysql/my.cnf + - ./log:/var/log/mysql command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci diff --git a/apps/nginx/1.23.1/conf/conf.d/default.conf b/apps/nginx/1.23.1/conf/conf.d/default.conf new file mode 100644 index 000000000..e69de29bb diff --git a/apps/nginx/1.23.1/conf/nginx.conf b/apps/nginx/1.23.1/conf/nginx.conf new file mode 100644 index 000000000..2e3b34698 --- /dev/null +++ b/apps/nginx/1.23.1/conf/nginx.conf @@ -0,0 +1,29 @@ +events { + # 设置网路连接序列化 + accept_mutex on; + # 一个进程是否同时接受多个网络连接 + multi_accept on; + # 事件驱动模型 + use epoll; + # 最大连接数 + worker_connections 1024; +} + +http { + #http全局块 + include mime.types; + default_type application/octet-stream; + sendfile on; + keepalive_timeout 65; + #server块 + server { + #server全局块 + listen 80; + server_name localhost; + #location块 + location / { + root html; + index index.html index.htm; + } + } +} \ No newline at end of file diff --git a/apps/nginx/1.23.1/docker-compose.yml b/apps/nginx/1.23.1/docker-compose.yml new file mode 100644 index 000000000..2119703f3 --- /dev/null +++ b/apps/nginx/1.23.1/docker-compose.yml @@ -0,0 +1,13 @@ +services: + nginx1.23.1: + container_name: ${CONTAINER_NAME} + image: nginx:1.23.1 + restart: always + ports: + - ${PORT}:80 + volumes: + - ./conf/nginx.conf:/etc/nginx/nginx.conf + - ./www:/home/www + - ./log:/var/log/nginx + - ./conf/conf.d/default.conf:/etc/nginx/conf.d/default.conf + - ./html:/usr/share/nginx/html \ No newline at end of file diff --git a/apps/nginx/1.23.1/html/index.html b/apps/nginx/1.23.1/html/index.html new file mode 100644 index 000000000..30d74d258 --- /dev/null +++ b/apps/nginx/1.23.1/html/index.html @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/apps/nginx/1.23.1/params.json b/apps/nginx/1.23.1/params.json new file mode 100644 index 000000000..aee124183 --- /dev/null +++ b/apps/nginx/1.23.1/params.json @@ -0,0 +1,12 @@ +{ + "formFields": [ + { + "type": "number", + "labelZh": "端口", + "labelEn": "Port", + "required": true, + "default": 3306, + "envKey": "PORT" + } + ] +} \ No newline at end of file diff --git a/backend/app/service/app.go b/backend/app/service/app.go index 9e3ef7ede..dbd91a1ca 100644 --- a/backend/app/service/app.go +++ b/backend/app/service/app.go @@ -14,7 +14,6 @@ import ( "github.com/1Panel-dev/1Panel/utils/files" "github.com/joho/godotenv" "golang.org/x/net/context" - "math" "os" "path" "reflect" @@ -219,8 +218,8 @@ func (a AppService) Install(name string, appDetailId uint, params map[string]int port, ok := params["PORT"] if ok { - port := int(math.Floor(port.(float64))) - if common.ScanPort(string(port)) { + portStr := strconv.FormatFloat(port.(float64), 'f', -1, 32) + if common.ScanPort(portStr) { return errors.New("port is in used") } } diff --git a/backend/go.mod b/backend/go.mod index c857d7cea..137dfc48e 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -19,6 +19,7 @@ require ( github.com/gorilla/websocket v1.5.0 github.com/gwatts/gin-adapter v1.0.0 github.com/jinzhu/copier v0.3.5 + github.com/joho/godotenv v1.4.0 github.com/kr/pty v1.1.1 github.com/mholt/archiver/v4 v4.0.0-alpha.7 github.com/minio/minio-go/v7 v7.0.36 @@ -39,6 +40,7 @@ require ( github.com/swaggo/swag v1.8.4 github.com/xlzd/gotp v0.0.0-20220817083547-a63b9d03d72f golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa + golang.org/x/net v0.0.0-20220722155237-a158d28d115b golang.org/x/text v0.3.7 gopkg.in/yaml.v2 v2.4.0 gorm.io/driver/mysql v1.3.5 @@ -76,7 +78,6 @@ require ( github.com/google/flatbuffers v1.12.1 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/securecookie v1.1.1 // indirect - github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect @@ -117,7 +118,6 @@ require ( go.opentelemetry.io/otel v1.0.0 // indirect go.opentelemetry.io/otel/trace v1.0.0 // indirect golang.org/x/image v0.0.0-20190802002840-cff245a6509b // indirect - golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect golang.org/x/tools v0.1.10 // indirect diff --git a/backend/go.sum b/backend/go.sum index c2a8c8279..885b3ef37 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -247,8 +247,6 @@ github.com/grokify/html-strip-tags-go v0.0.1 h1:0fThFwLbW7P/kOiTBs03FsJSV9RM2M/Q github.com/grokify/html-strip-tags-go v0.0.1/go.mod h1:2Su6romC5/1VXOQMaWL2yb618ARB8iVo6/DR99A6d78= github.com/gwatts/gin-adapter v1.0.0 h1:TsmmhYTR79/RMTsfYJ2IQvI1F5KZ3ZFJxuQSYEOpyIA= github.com/gwatts/gin-adapter v1.0.0/go.mod h1:44AEV+938HsS0mjfXtBDCUZS9vONlF2gwvh8wu4sRYc= -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= diff --git a/frontend/src/views/app-store/detail/install.vue b/frontend/src/views/app-store/detail/install.vue index b71c1a310..2b46919cd 100644 --- a/frontend/src/views/app-store/detail/install.vue +++ b/frontend/src/views/app-store/detail/install.vue @@ -31,7 +31,7 @@