github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/cmd/puppeth/module_nginx.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 //版权所有2017 Go Ethereum作者 10 //此文件是Go以太坊的一部分。 11 // 12 //Go以太坊是免费软件:您可以重新发布和/或修改它 13 //根据GNU通用公共许可证的条款 14 //自由软件基金会,或者许可证的第3版,或者 15 //(由您选择)任何更高版本。 16 // 17 //Go以太坊的分布希望它会有用, 18 //但没有任何保证;甚至没有 19 //适销性或特定用途的适用性。见 20 //GNU通用公共许可证了解更多详细信息。 21 // 22 //你应该已经收到一份GNU通用公共许可证的副本 23 //一起去以太坊吧。如果没有,请参见<http://www.gnu.org/licenses/>。 24 25 package main 26 27 import ( 28 "bytes" 29 "fmt" 30 "html/template" 31 "math/rand" 32 "path/filepath" 33 "strconv" 34 35 "github.com/ethereum/go-ethereum/log" 36 ) 37 38 // 39 //代理。 40 var nginxDockerfile = `FROM jwilder/nginx-proxy` 41 42 // 43 // 44 //在单个主机上运行的服务。 45 var nginxComposefile = ` 46 version: '2' 47 services: 48 nginx: 49 build: . 50 image: {{.Network}}/nginx 51 ports: 52 - "{{.Port}}:80" 53 volumes: 54 - /var/run/docker.sock:/tmp/docker.sock:ro 55 logging: 56 driver: "json-file" 57 options: 58 max-size: "1m" 59 max-file: "10" 60 restart: always 61 ` 62 63 // 64 // 65 // 66 func deployNginx(client *sshClient, network string, port int, nocache bool) ([]byte, error) { 67 log.Info("Deploying nginx reverse-proxy", "server", client.server, "port", port) 68 69 //生成要上载到服务器的内容 70 workdir := fmt.Sprintf("%d", rand.Int63()) 71 files := make(map[string][]byte) 72 73 dockerfile := new(bytes.Buffer) 74 template.Must(template.New("").Parse(nginxDockerfile)).Execute(dockerfile, nil) 75 files[filepath.Join(workdir, "Dockerfile")] = dockerfile.Bytes() 76 77 composefile := new(bytes.Buffer) 78 template.Must(template.New("").Parse(nginxComposefile)).Execute(composefile, map[string]interface{}{ 79 "Network": network, 80 "Port": port, 81 }) 82 files[filepath.Join(workdir, "docker-compose.yaml")] = composefile.Bytes() 83 84 //将部署文件上载到远程服务器(然后清理) 85 if out, err := client.Upload(files); err != nil { 86 return out, err 87 } 88 defer client.Run("rm -rf " + workdir) 89 90 // 91 if nocache { 92 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)) 93 } 94 return nil, client.Stream(fmt.Sprintf("cd %s && docker-compose -p %s up -d --build --force-recreate --timeout 60", workdir, network)) 95 } 96 97 // 98 // 99 type nginxInfos struct { 100 port int 101 } 102 103 //报表将类型化结构转换为纯字符串->字符串映射,其中包含 104 //大多数(但不是全部)字段用于向用户报告。 105 func (info *nginxInfos) Report() map[string]string { 106 return map[string]string{ 107 "Shared listener port": strconv.Itoa(info.port), 108 } 109 } 110 111 // 112 //它正在运行,如果是,收集有关它的有用信息。 113 func checkNginx(client *sshClient, network string) (*nginxInfos, error) { 114 // 115 infos, err := inspectContainer(client, fmt.Sprintf("%s_nginx_1", network)) 116 if err != nil { 117 return nil, err 118 } 119 if !infos.running { 120 return nil, ErrServiceOffline 121 } 122 //容器可用,组装并返回有用的信息 123 return &nginxInfos{ 124 port: infos.portmap["80/tcp"], 125 }, nil 126 }