使用athens部署企业内部Gitlab go mod包的Go私服代理
# 1,前言
當前 go 開發,已經全面投入到 mod 的懷抱,國內也有一些優秀的代理,例如 https://goproxy.io,https://goproxy.cn等,但是企業內網的 gitlab 上的包如何也能想公網包那樣引用拉取呢,這是一個問題,我曾體驗過如上 goproxy 這個項目的開源版本,但是內網拉包仍舊是一個沒有完美解決的問題,公司在用的是 athens,還不甚熟悉,但是為了能對它胸有成竹,今天打算鉆研一番。
之前的文檔云里霧里,自己跑了一遍也沒有跑通,網上的文章也都是沒有能夠參考的。今天再次自己研究,果然功夫不負有心人,重要的還是要靜下心認真看人家的官方文檔才行。
之前生產在跑的鏡像是 latest 版本,以至于很多內容不好控制,進到容器里看了下用的是 0.3.0 版本的,目前官方已經更新到了 0.10.0,相差很遠了,今天就來固定版本,并且完美跑通。
部分信息內容已經脫敏處理,如果讀者有迷惑的地方,歡迎留言交流。本文偏向于構建內部私服代理,如果想要構建一個包容性更強的大私服,可以參考這篇文章。
# 2,配置
下載對應鏡像,這不多說:
docker pull gomods/athens:v0.10.0 # 如果太慢,可以用如下鏡像 registry.cn-hangzhou.aliyuncs.com/eryajf/athens:v0.10.0這里需要用到官方對應版本的配置文件,可以下載對應 release 的配置文件解壓拿到,還有其他一些配置文件,目錄詳情如下:
$ pwd /data/athens $ tree -a . |-- config | |-- config.toml --------# 主配置文件 | |-- FilterForGoCenter --# 一個過濾配置 | `-- .netrc ------------# 拉取gitlab時配置轉換信息 |-- gitconfig | `-- ssh-keys --------# 拉取gitlab包時認證信息 | |-- config --------# 認證gitlab的信息 | |-- id_rsa --------# 私鑰 | |-- id_rsa.pub ----# 公鑰 | `-- known_hosts `-- storage ----------------# 緩存目錄 4 directories, 7 files config.toml: $ cat config.toml | egrep -v '^$|^#|^.*#' GoBinary = "go" GoEnv = "development" GoProxy = "direct" GoBinaryEnvVars = ["GOPROXY=direct"] GoGetWorkers = 10 GoGetDir = "/data/athens/storage" # go get 時的目錄 ProtocolWorkers = 30 LogLevel = "debug" CloudRuntime = "none" EnablePprof = false PprofPort = ":3001" FilterFile = "" RobotsFile = "robots.txt" Timeout = 300 StorageType = "disk" Port = ":3000" GlobalEndpoint = "http://localhost:3001" BasicAuthUser = "" BasicAuthPass = "" ForceSSL = false ValidatorHook = "" PathPrefix = "" NETRCPath = "" GithubToken = "" HGRCPath = "" TraceExporter = "" TraceExporterURL = "http://localhost:14268" StatsExporter = "prometheus" SumDBs = ["https://sum.golang.google.cn"] NoSumPatterns = [] DownloadMode = "sync" DownloadURL = "" SingleFlightType = "memory" IndexType = "none" [SingleFlight][SingleFlight.Etcd]Endpoints = "localhost:2379,localhost:22379,localhost:32379"[SingleFlight.Redis]Endpoint = "127.0.0.1:6379"Password = ""[SingleFlight.RedisSentinel]Endpoints = ["127.0.0.1:26379"]MasterName = "redis-1"SentinelPassword = "sekret" [Storage][Storage.CDN]Endpoint = "cdn.example.com"[Storage.Disk]RootPath = "/data/athens/storage"[Storage.GCP]ProjectID = "MY_GCP_PROJECT_ID"Bucket = "MY_GCP_BUCKET"JSONKey = ""[Storage.Minio]Endpoint = "127.0.0.1:9001"Key = "minio"Secret = "minio123"EnableSSL = falseBucket = "gomods"Region = ""[Storage.Mongo]URL = "mongodb://127.0.0.1:27017"DefaultDBName = "athens"CertPath = ""Insecure = false[Storage.S3]Region = "MY_AWS_REGION"Key = "MY_AWS_ACCESS_KEY_ID"Secret = "MY_AWS_SECRET_ACCESS_KEY"Token = ""Bucket = "MY_S3_BUCKET_NAME"ForcePathStyle = falseUseDefaultConfiguration = falseCredentialsEndpoint = ""AwsContainerCredentialsRelativeURI = ""Endpoint = ""[Storage.AzureBlob]AccountName = "MY_AZURE_BLOB_ACCOUNT_NAME"AccountKey = "MY_AZURE_BLOB_ACCOUNT_KEY"ContainerName = "MY_AZURE_BLOB_CONTAINER_NAME"[Storage.External]URL = "" [Index][Index.MySQL]Protocol = "tcp"Host = "localhost"Port = 3306User = "root"Password = ""Database = "athens"[Index.MySQL.Params]parseTime = "true"timeout = "30s"[Index.Postgres]Host = "localhost"Port = 5432User = "postgres"Password = ""Database = "athens"[Index.Postgres.Params]connect_timeout = "30s"sslmode = "disable" FilterForGoCenter: $ cat FilterForGoCenter + D golang.org D k8s.io D cloud.google.com D google.golang.org D github.com D sigs.k8s.io D sourcegraph.com D gopkg.in config: $ cat config Host gitlab.test.com Hostname gitlab.test.com StrictHostKeyChecking no IdentityFile /root/.ssh/id_rsa剩下兩個秘鑰文件就不展示了,不過需要注意的一點是,通過秘鑰認證的話,要注意這個秘鑰在 gitlab 當中的權限,是否能夠拉取依賴的 go 項目。
使用如下命令啟動服務:
docker run -d --net=host \-v /data/athens/storage:/data/athens \-v /data/athens/config:/config \-v /data/athens/gitconfig/.gitconfig:/root/.gitconfig \-v /data/athens/gitconfig/ssh-keys:/root/.ssh \-v /etc/nsswitch.conf:/etc/nsswitch.conf \-e ATHENS_DISK_STORAGE_ROOT=/data/athens \-e ATHENS_NETRC_PATH=/config/.netrc \-e ATHENS_STORAGE_TYPE=disk \-e ATHENS_DOWNLOAD_MODE=sync \-e ATHENS_GONOSUM_PATTERNS='gitlab.test.com/*' \-e GOSUMDB="sum.golang.google.cn" \--name athens-proxy --add-host gitlab.test.com:192.168.0.1 \--restart always -p 0.0.0.0:3000:3000 gomods/athens:v0.10.0這樣基本上就能提供服務了,不過這個時候可能拉外網的包還會有問題,所以在 github 看到有同學用如下方案曲線救國了一下,在 NGINX 配置中添加如下內容:
upstream my-athens {server 127.0.0.1:3000; } server {listen 4000;location / {proxy_pass https://goproxy.io;proxy_cache_valid 30d;}location ~ /(gitlab\.test\.com)/ {proxy_pass http://my-athens;} }# 3,驗證
然后即可投入使用了,簡單驗證一下,在客戶端配置如下內容,我在 go1.12 環境下測試的:
export GO111MODULE=on export GOPROXY="http://192.168.0.2:4000"接著下一兩個包試試效果:
go get -u github.com/gin-gonic/gin先拉外部的包,此時發現速度杠杠的,通過 NGINX 日志也能對應的請求:
192.168.0.3 - - [21/Jul/2020:22:20:51 +0800] "GET /github.com/gin-gonic/gin/@v/v1.6.3.info HTTP/1.1" 200 50 "-" "Go-http-client/1.1" "-" "-" "10.3.6.27" "##0.136##" "##0.136##"然后再測試內網包:
go get gitlab.test.com/micro-service/sale-srv@v0.1.21也可以看到正常下載下來了,然后也能在私服緩存當中看到這個包了。
$ ls /data/athens/storage/gitlab.test.com/micro-service/sale-srv v0.1.21非常完美!
# 4,踩坑
關于拉取內部包失敗的一些原因:
最后再次感謝 athens 的開源分享,讓我們的工作顯得更加輕巧便捷。
# 5,參考
原文鏈接
官方文檔
官方鏡像 - Dockerfile
下載方式的介紹
https://github.com/gomods/athens/issues/1471
總結
以上是生活随笔為你收集整理的使用athens部署企业内部Gitlab go mod包的Go私服代理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用nexus3配置golang私有仓库
- 下一篇: 通过Athens搭建go私服