部署 goproxy 服务

上一篇已经实践了在私网环境中配置自签名的证书,并开启 https。

这一切都是为了能在私网中搭建一个方便可用的 Go 集成环境。

Go 在 1.11 版本添加了 Go Module 特性,成为官方推荐的包管理方式。
详情见官方 wiki

与 go mod 同时到来的还有 goproxy ,允许使用代理的方式拉取依赖包。

介绍

goproxy 解决了几个长期存在的问题:

  1. 国内网络环境下从 github 拉去依赖包速度很慢
  2. 如果开源作者删除了仓库,对应依赖包就无法找到

goproxy 代理服务会缓存依赖包版本,不需要重复下载,也不需要担心原库被删除。

有许多开放的代理服务,比如我常用的是 https://goproxy.io

只需要设置环境变量 GOPROXY=https://goproxy.io 就能享受代理的快捷。

但是公开的 goproxy 服务仅可以访问公开的仓库,对于私有项目或者
私网环境,咱们还得自己建。

选型

有几款不错的 goproxy 项目

虽然 athens star 数最多,配置文件很灵活可配项很多,但是我觉得它很长一段时间都会是 beta 状态,我自己部署也不需要太多定制化。

我最后选择了 goproxyio 的项目,代码不多,也很稳定。

编译

goproxyio 发布了 docker 镜像,可以很方便地使用 docker 部署 goproxy。

这里我们讲一下源码编译。其实也是相当简单,按照 README 文档,一条命令搞定。

1
make

当然你先要装好 gomake

linux 下编译完成后就出现了 goproxy 执行文件。

部署

新版 goproxy 需要调用 go mod 命令,所以部署环境要安装 go 1.12 (1.12 版本以后支持在任意目录调用 go mod download 命令)。

上传 goproxy 执行文件到 linux 主机上,放在任意目录下。

直接 ./goproxy 运行,会在 8081 端口上开启代理服务,然后本地开发环境,配置 GOPROXY 环境变量。

假设内网 linux 主机 ip 地址是 10.0.0.1,请自行替换 ip 地址。

1
export GOPROXY=http://10.0.0.1:8081

再任意 go mod 管理地项目下执行 go get ,你就能看到 goproxy 服务代你请求了目标地址。

如果你配置了 GOPATH 环境变量, goproxy 服务就会缓存到 $GOPATH/pkg/mod 下。

如果你不愿意设置 GOPATH 环境变量,也可以使用 -cacheDir 参数指定缓存目录。

如果你不想使用 8081 端口,可以使用 -listen 参数指定新的端口。

本地网络不好希望加一个公共 goproxy 作代理转发,那么设置 -proxy

假设私有仓库地址 cvs.private.com 不希望走代理,那么设置 -exclude,配置域名或者完整仓库路径。

更多使用说明见 ./goproxy -h

进程管理

仅仅 nohup 的方式启动 goproxy 服务太 low 了,咱们使用 systemd 管理。

路由模式依赖 go mod -m 命令需要执行目录是 go mod 目录,所以无法使用 systemd 管理。

编写一个 goproxy.service 文件
项目源码目录下 scripts 下有 service 配置文件,可以直接使用。

一定要配置 Environment


放到 /etc/systemd/system/ 目录下

> 假设程序在 /root/goproxy/goproxy, 请自行替换启动文件路径。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Unit]
Description=goproxy service
Documentation=https://goproxy.io
After=network-online.target

[Service]
Environment=PATH=/usr/local/go/bin
User=root
Group=root
LimitNOFILE=65536
ExecStart=/root/goproxy/goproxy -cacheDir=/root/go -proxy=https://goproxy.io -exclude="*.private.com"
KillMode=control-group
SuccessExitStatus=2
Restart=always

[Install]
WantedBy=multi-user.target
Alias=goproxy.service


关于如何编写 service 文件,我推荐一篇不错地教程

最后启动服务

1
2
3
4
5
6
7
8
# 启动服务
sudo systemctl start goproxy

# (可选)开启自启
sudo systemctl enable goproxy

# 查看状态
sudo systemctl status goproxy

参考