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