github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/cmd/puppeth/module_nginx.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:33</date> 10 //</624450069478772736> 11 12 13 package main 14 15 import ( 16 "bytes" 17 "fmt" 18 "html/template" 19 "math/rand" 20 "path/filepath" 21 "strconv" 22 23 "github.com/ethereum/go-ethereum/log" 24 ) 25 26 // 27 //代理。 28 var nginxDockerfile = `FROM jwilder/nginx-proxy` 29 30 // 31 // 32 //在单个主机上运行的服务。 33 var nginxComposefile = ` 34 version: '2' 35 services: 36 nginx: 37 build: . 38 image: {{.Network}}/nginx 39 container_name: {{.Network}}_nginx_1 40 ports: 41 - "{{.Port}}:80" 42 volumes: 43 - /var/run/docker.sock:/tmp/docker.sock:ro 44 logging: 45 driver: "json-file" 46 options: 47 max-size: "1m" 48 max-file: "10" 49 restart: always 50 ` 51 52 // 53 //在单个主机上运行的HTTP服务。如果具有指定的 54 //网络名已经存在,将被覆盖! 55 func deployNginx(client *sshClient, network string, port int, nocache bool) ([]byte, error) { 56 log.Info("Deploying nginx reverse-proxy", "server", client.server, "port", port) 57 58 //生成要上载到服务器的内容 59 workdir := fmt.Sprintf("%d", rand.Int63()) 60 files := make(map[string][]byte) 61 62 dockerfile := new(bytes.Buffer) 63 template.Must(template.New("").Parse(nginxDockerfile)).Execute(dockerfile, nil) 64 files[filepath.Join(workdir, "Dockerfile")] = dockerfile.Bytes() 65 66 composefile := new(bytes.Buffer) 67 template.Must(template.New("").Parse(nginxComposefile)).Execute(composefile, map[string]interface{}{ 68 "Network": network, 69 "Port": port, 70 }) 71 files[filepath.Join(workdir, "docker-compose.yaml")] = composefile.Bytes() 72 73 //将部署文件上载到远程服务器(然后清理) 74 if out, err := client.Upload(files); err != nil { 75 return out, err 76 } 77 defer client.Run("rm -rf " + workdir) 78 79 // 80 if nocache { 81 return nil, client.Stream(fmt.Sprintf("cd %s && docker-compose -p %s build --pull --no-cache && docker-compose -p %s up -d --force-recreate --timeout 60", workdir, network, network)) 82 } 83 return nil, client.Stream(fmt.Sprintf("cd %s && docker-compose -p %s up -d --build --force-recreate --timeout 60", workdir, network)) 84 } 85 86 //nginxinfos从nginx反向代理状态检查返回以允许 87 // 88 type nginxInfos struct { 89 port int 90 } 91 92 //报表将类型化结构转换为纯字符串->字符串映射,其中包含 93 //大多数(但不是全部)字段用于向用户报告。 94 func (info *nginxInfos) Report() map[string]string { 95 return map[string]string{ 96 "Shared listener port": strconv.Itoa(info.port), 97 } 98 } 99 100 //check nginx对nginx反向代理进行健康检查,以验证 101 //它正在运行,如果是,收集有关它的有用信息。 102 func checkNginx(client *sshClient, network string) (*nginxInfos, error) { 103 // 104 infos, err := inspectContainer(client, fmt.Sprintf("%s_nginx_1", network)) 105 if err != nil { 106 return nil, err 107 } 108 if !infos.running { 109 return nil, ErrServiceOffline 110 } 111 //容器可用,组装并返回有用的信息 112 return &nginxInfos{ 113 port: infos.portmap["80/tcp"], 114 }, nil 115 } 116