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  }