From c8912282fd9b0b2da22ec817eb9672c079681bfb Mon Sep 17 00:00:00 2001 From: AceAttorney Date: Sun, 4 Jul 2021 11:01:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0docker-compose=20=E4=B8=80?= =?UTF-8?q?=E9=94=AE=E9=83=A8=E7=BD=B2=E5=8F=8A=E7=8E=AF=E5=A2=83=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E4=BC=A0=E5=85=A5,=20=E6=B7=BB=E5=8A=A0=E9=95=9C?= =?UTF-8?q?=E5=83=8F=E4=BB=93=E5=BA=93=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go-wecomchan/README.md | 73 ++++++++++++++++++++++++++++++--- go-wecomchan/docker-compose.yml | 37 +++++++++++++++++ go-wecomchan/wecomchan.go | 34 +++++++++------ 3 files changed, 125 insertions(+), 19 deletions(-) create mode 100644 go-wecomchan/docker-compose.yml diff --git a/go-wecomchan/README.md b/go-wecomchan/README.md index 4ee28ca..1b8aee4 100644 --- a/go-wecomchan/README.md +++ b/go-wecomchan/README.md @@ -2,11 +2,31 @@ ## 配置说明 -直接使用和构建二进制文件使用需要golang环境,并且网络可以安装依赖。 -docker构建镜像使用,需要安装docker,不依赖golang以及网络。 +直接使用和构建二进制文件使用需要golang环境,并且网络可以安装依赖。 +docker构建镜像使用,需要安装docker,不依赖golang以及网络。 + +## 修改默认值 + +修改的sendkey,企业微信公司ID 等默认值为你的企业中的相关信息,如不设置运行时和打包后都可通过环境变量传入。 + +```golang +var SENDKEY string = GetEnvDefault("SENDKEY", "set_a_sendkey") +var WECOM_CID string = GetEnvDefault("WECOM_CID", "企业微信公司ID") +var WECOM_SECRET string = GetEnvDefault("WECOM_SECRET", "企业微信应用Secret") +var WECOM_AID string = GetEnvDefault("WECOM_AID", "企业微信应用ID") +var WECOM_TOUID string = GetEnvDefault("WECOM_TOUID", "@all") +var REDIS_ADDR string = GetEnvDefault("REDIS_ADDR", "localhost:6379") +var REDIS_STAT string = GetEnvDefault("REDIS_STAT", "OFF") +var REDIS_PASSWORD string = GetEnvDefault("REDIS_PASSWORD", "") + +``` ## 直接使用 +如果没有添加默认值,需要先引入环境变量,以SENDKEY为例: + +`export SENDKEY=set_a_sendkey` +依次引入环境变量后,执行 `go run .` ## build命令构建二进制文件使用 @@ -18,18 +38,59 @@ docker构建镜像使用,需要安装docker,不依赖golang以及网络。 ## 构建docker镜像使用(推荐,不依赖golang,不依赖网络) +新增打包好的镜像可以直接使用 + +`docker pull aozakiaoko/go-wecomchan` + +Docker Hub 地址为:[https://hub.docker.com/r/aozakiaoko/go-wecomchan](https://hub.docker.com/r/aozakiaoko/go-wecomchan) + 1. 构建镜像 `docker build -t go-wecomchan .` -2. 启动镜像 +2. 修改默认值后启动镜像 `docker run -dit -p 8080:8080 go-wecomchan` +3. 通过环境变量启动镜像并启用redis + +```bash +docker run -dit -e SENDKEY=set_a_sendkey \ +-e WECOM_CID=企业微信公司ID \ +-e WECOM_SECRET=企业微信应用Secret \ +-e WECOM_AID=企业微信应用ID \ +-e WECOM_TOUID="@all" \ +-e REDIS_STAT=ON \ +-e REDIS_ADDR="localhost:6379" \ +-e REDIS_PASSWORD="" \ +-p 8080:8080 aozakiaoko/go-wecomchan +``` + +如不使用redis不要传入最后三个关于redis的环境变量 + +4. 环境变量说明 + +|名称|描述| +|---|---| +|SENDKEY|发送时用来验证的key| +|WECOM_CID|企业微信公司ID| +|WECOM_SECRET|企业微信应用Secret| +|WECOM_AID|企业微信应用ID| +|WECOM_TOUID|需要发送给的人,详见[企业微信官方文档](https://work.weixin.qq.com/api/doc/90000/90135/90236#%E6%96%87%E6%9C%AC%E6%B6%88%E6%81%AF)| +|REDIS_ADDR|redis服务器地址,如不启用redis缓存可不设置| +|REDIS_STAT|是否启用redis换缓存token| +|REDIS_PASSWORD|redis的连接密码| + +## 使用docker-compose 部署 + +修改docker-compose.yml 文件内上述的环境变量,之后执行 + +`docker-compose up -d` + ## 调用方式 访问 `http://localhost:8080/wecomchan?sendkey=你配置的sendkey&&msg=需要发送的消息&&msg_type=text` ## 后续预计添加 -~~- Dockerfile 打包镜像(不依赖网络环境)~~ -- docker-compose redis + go-wecomchan 一键部署 -- 通过环境变量传递企业微信id,secret等,镜像一次构建多次使用 +* [x] Dockerfile 打包镜像(不依赖网络环境) +* [x] 通过环境变量传递企业微信id,secret等,镜像一次构建多次使用 +* [x] docker-compose redis + go-wecomchan 一键部署 diff --git a/go-wecomchan/docker-compose.yml b/go-wecomchan/docker-compose.yml new file mode 100644 index 0000000..fa558f8 --- /dev/null +++ b/go-wecomchan/docker-compose.yml @@ -0,0 +1,37 @@ +version: '3' + +services: + go-wecomchan: + image: docker.io/aozakiaoko/go-wecomchan:latest + environment: + - SENDKEY=发送时用来验证的key + - WECOM_CID=企业微信公司ID + - WECOM_SECRET=企业微信应用Secret + - WECOM_AID=企业微信应用ID + - WECOM_TOUID=@all + - REDIS_STAT=ON + - REDIS_ADDR=redis:6379 + - REDIS_PASSWORD=redis的连接密码 + ports: + - 8080:8080 + networks: + - go-wecomchan + depends_on: + - redis + + redis: + image: docker.io/bitnami/redis:6.2 + environment: + - REDIS_PASSWORD=redis的连接密码 + - REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL + networks: + - go-wecomchan + volumes: + - 'redis_data:/bitnami/redis/data' + +volumes: + redis_data: + driver: local + +networks: + go-wecomchan: diff --git a/go-wecomchan/wecomchan.go b/go-wecomchan/wecomchan.go index aae23f7..ffe10be 100644 --- a/go-wecomchan/wecomchan.go +++ b/go-wecomchan/wecomchan.go @@ -5,25 +5,33 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" "log" "net/http" + "os" "reflect" "time" "github.com/go-redis/redis/v8" ) -var SENDKEY string = "set_a_sendkey" -var WECOM_CID string = "企业微信公司ID" -var WECOM_SECRET string = "企业微信应用Secret" -var WECOM_AID string = "企业微信应用ID" -var WECOM_TOUID string = "@all" - -var REDIS_ADDR string = "localhost:6379" +var SENDKEY string = GetEnvDefault("SENDKEY", "set_a_sendkey") +var WECOM_CID string = GetEnvDefault("WECOM_CID", "企业微信公司ID") +var WECOM_SECRET string = GetEnvDefault("WECOM_SECRET", "企业微信应用Secret") +var WECOM_AID string = GetEnvDefault("WECOM_AID", "企业微信应用ID") +var WECOM_TOUID string = GetEnvDefault("WECOM_TOUID", "@all") +var REDIS_ADDR string = GetEnvDefault("REDIS_ADDR", "localhost:6379") +var REDIS_STAT string = GetEnvDefault("REDIS_STAT", "OFF") +var REDIS_PASSWORD string = GetEnvDefault("REDIS_PASSWORD", "") var ctx = context.Background() -var redis_stat string = "OFF" + +func GetEnvDefault(key, defVal string) string { + val, ex := os.LookupEnv(key) + if !ex { + return defVal + } + return val +} func praser_json(json_str string) map[string]interface{} { var wecom_response map[string]interface{} @@ -53,8 +61,8 @@ func get_token(corpid, app_secret string) string { func redis_client() *redis.Client { rdb := redis.NewClient(&redis.Options{ Addr: REDIS_ADDR, - Password: "", // no password set - DB: 0, // use default DB + Password: REDIS_PASSWORD, // no password set + DB: 0, // use default DB }) return rdb } @@ -105,7 +113,7 @@ func IsZero(v interface{}) (bool, error) { func main() { var access_token string - if redis_stat == "ON" { + if REDIS_STAT == "ON" { log.Println("从redis获取token") rdb := redis_client() vals, err := rdb.Get(ctx, "access_token").Result() @@ -135,7 +143,7 @@ func main() { if err != nil { fmt.Printf("%v", err) } else { - if ok && redis_stat == "ON" { + if ok && REDIS_STAT == "ON" { log.Println("pre to set redis key") rdb := redis_client() set, err := rdb.SetNX(ctx, "access_token", access_token, 7000*time.Second).Result()