浏览代码

feat: 支持服务端口自定义 (#123)

二丫讲梵 2 年之前
父节点
当前提交
bc55f74c78
共有 5 个文件被更改,包括 21 次插入4 次删除
  1. 7 3
      README.md
  2. 1 0
      config.dev.json
  3. 9 0
      config/config.go
  4. 1 0
      docker-compose.yml
  5. 3 1
      main.go

+ 7 - 3
README.md

@@ -120,11 +120,14 @@
 ```
 第一种:基于环境变量运行
 # 运行项目
-$ docker run -itd --name chatgpt -p 8090:8090 --add-host="host.docker.internal:host-gateway" -e APIKEY=换成你的key -e BASE_URL="" -e MODEL="gpt-3.5-turbo" -e SESSION_TIMEOUT=600 -e HTTP_PROXY="http://host.docker.internal:15732" -e DEFAULT_MODE="单聊" -e MAX_REQUEST=0 -e SERVICE_URL="你当前服务外网可访问的URL" --restart=always  dockerproxy.com/eryajf/chatgpt-dingtalk:latest
+$ docker run -itd --name chatgpt -p 8090:8090 --add-host="host.docker.internal:host-gateway" -e APIKEY=换成你的key -e BASE_URL="" -e MODEL="gpt-3.5-turbo" -e SESSION_TIMEOUT=600 -e HTTP_PROXY="http://host.docker.internal:15732" -e DEFAULT_MODE="单聊" -e MAX_REQUEST=0 -e PORT=8090 -e SERVICE_URL="你当前服务外网可访问的URL" --restart=always  dockerproxy.com/eryajf/chatgpt-dingtalk:latest
 ```
 
+`📢 注意:`如果使用docker部署,那么PORT参数不需要进行任何调整。
+`📢 注意:`如果服务器节点本身就在国外或者自定义了`BASE_URL`,那么就把`HTTP_PROXY`参数留空即可。
 `📢 注意:`如果使用docker部署,那么proxy地址可以直接使用如上方式部署,`host.docker.internal`会指向容器所在宿主机的IP,只需要更改端口为你的代理端口即可。参见:[Docker容器如何优雅地访问宿主机网络](https://wiki.eryajf.net/pages/674f53/)
 
+
 运行命令中映射的配置文件参考下边的配置文件说明。
 
 ```
@@ -217,7 +220,7 @@ $ curl --location --request POST 'http://chat.eryajf.net/' \
 ```sh
 $ tar xf chatgpt-dingtalk-v0.0.4-darwin-arm64.tar.gz
 $ cd chatgpt-dingtalk-v0.0.4-darwin-arm64
-$ cp config.dev.json  config.json # 然后根据情况调整配置文件内容
+$ cp config.dev.json  config.json # 然后根据情况调整配置文件内容,宿主机如遇端口冲突,可通过调整config.json中的port参数自定义服务端口
 $ ./chatgpt-dingtalk  # 直接运行
 
 # 如果要守护在后台运行
@@ -302,7 +305,8 @@ $ go run main.go
     "session_timeout": 600,   // 会话超时时间,默认600秒,在会话时间内所有发送给机器人的信息会作为上下文
     "http_proxy": "",         // 指定请求时使用的代理,如果为空,则不使用代理
     "default_mode": "单聊",    // 默认对话模式,可根据实际场景自定义,如果不设置,默认为单聊
-    "max_request": 0    // 单人单日请求次数限制,默认为0,即不限制
+    "max_request": 0,    // 单人单日请求次数限制,默认为0,即不限制
+    "port": "8090",     // 指定服务启动端口,默认为 8090,一般在二进制宿主机部署时,遇到端口冲突时使用。
     "service_url": "" // 指定服务的地址,就是当前服务可供外网访问的地址,用于生成图片时给钉钉渲染
 }
 ```

+ 1 - 0
config.dev.json

@@ -6,5 +6,6 @@
     "http_proxy": "",
     "default_mode": "单聊",
     "max_request": 0,
+    "port": "8090",
     "service_url": "http://chat.eryajf.net"
 }

+ 9 - 0
config/config.go

@@ -27,6 +27,8 @@ type Configuration struct {
 	HttpProxy string `json:"http_proxy"`
 	// 用户单日最大请求次数
 	MaxRequest int `json:"max_request"`
+	// 指定服务启动端口,默认为 8090
+	Port string `json:"port"`
 	// 指定服务的地址,就是钉钉机器人配置的回调地址,比如: http://chat.eryajf.net
 	ServiceURL string `json:"service_url"`
 }
@@ -59,6 +61,7 @@ func LoadConfig() *Configuration {
 		defaultMode := os.Getenv("DEFAULT_MODE")
 		httpProxy := os.Getenv("HTTP_PROXY")
 		maxRequest := os.Getenv("MAX_REQUEST")
+		port := os.Getenv("PORT")
 		serviceURL := os.Getenv("SERVICE_URL")
 		if apiKey != "" {
 			config.ApiKey = apiKey
@@ -89,6 +92,9 @@ func LoadConfig() *Configuration {
 			newMR, _ := strconv.Atoi(maxRequest)
 			config.MaxRequest = newMR
 		}
+		if port != "" {
+			config.Port = port
+		}
 		if serviceURL != "" {
 			config.ServiceURL = serviceURL
 		}
@@ -99,6 +105,9 @@ func LoadConfig() *Configuration {
 	if config.DefaultMode == "" {
 		config.DefaultMode = "单聊"
 	}
+	if config.Port == "" {
+		config.Port = "8090"
+	}
 	if config.ApiKey == "" {
 		logger.Danger("config err: api key required")
 	}

+ 1 - 0
docker-compose.yml

@@ -13,6 +13,7 @@ services:
       HTTP_PROXY: http://host.docker.internal:15777 # 配置代理,注意:host.docker.internal会解析到容器所在的宿主机IP,因此只需要更改端口即可,另外如果服务器在国外,则这里留空即可
       DEFAULT_MODE: "单聊" # 聊天模式
       MAX_REQUEST: 0 # 单人单日请求次数限制,默认为0,即不限制
+      PORT: 8090 # 指定服务启动端口,默认为 8090,容器化部署时,不需要调整
       SERVICE_URL: ""  # 指定服务的地址,就是钉钉机器人配置的回调地址,比如: http://chat.eryajf.net
     ports:
       - "8090:8090"

+ 3 - 1
main.go

@@ -73,6 +73,8 @@ func Start() {
 		return c.File(filepath.Join(root, filename))
 	})
 
+	// 服务端口
+	port := ":" + public.Config.Port
 	// 启动服务器
-	ship.StartServer(":8090", app)
+	ship.StartServer(port, app)
 }