溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么使用docker?compose部署golang的Athens私有代理

發(fā)布時(shí)間:2022-04-28 10:43:37 來源:億速云 閱讀:217 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“怎么使用docker compose部署golang的Athens私有代理”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“怎么使用docker compose部署golang的Athens私有代理”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。

go中私有代理搭建

為什么選擇 athens

私有化代理的選取標(biāo)準(zhǔn)無非就是下面的幾點(diǎn)

1、托管私有模塊;

2、排除對(duì)公有模塊的訪問;

3、存儲(chǔ)公有模塊;

athens 的特點(diǎn):

Athens 首先可以配置訪問私有倉(cāng)庫(kù);

Athens 的會(huì)存儲(chǔ)每次拉取的包,如果該模塊之前沒有通過 athens,athens 會(huì)向目標(biāo)地址請(qǐng)求數(shù)據(jù),在返回給客戶端的時(shí)候,會(huì)存儲(chǔ)該模塊到存儲(chǔ)中,這樣實(shí)現(xiàn)了 go mod download永遠(yuǎn)只會(huì)發(fā)生一次;

Athens 處理存儲(chǔ)的策略為僅追加,一個(gè)模塊被保存,它就永遠(yuǎn)不會(huì)改變,即使開發(fā)人員對(duì) tag 進(jìn)行了強(qiáng)推,那么也不會(huì)被刪除;

Athens 也可以配置下載策略,過濾一些有安全隱患的包。

Athens 支持 disk, mongo, gcs, s3, minio, 外部存儲(chǔ)/自定義,不過一般建議使用 disk。

使用 docker-compose 部署

官方網(wǎng)站已經(jīng),提供了通過 docker 和 二進(jìn)制部署的方案,這里秉著好記性不如爛筆頭的原則,這里自己也做了記錄

配置私有倉(cāng)庫(kù)的認(rèn)證信息

通過 .netrc 文件來配置,里面可以放自己的私有倉(cāng)庫(kù)的地址,以及用戶,密碼認(rèn)證信息

# cat .netrc
machine gitlab.test.com login test-name password test-pass

有幾個(gè)私有倉(cāng)庫(kù),配置幾個(gè)就可以了

配置下載模式

通過 The download mode (下載模式配置策略)是現(xiàn)在 ATHENS 中比較推崇的,之前通過 Filtering modules(過濾模式)的方法,目前已經(jīng)被棄用了。

來看下如何配置

# DownloadMode defines how Athens behaves when a module@version
# is not found in storage. There are 4 options:
# 1. "sync" (default): download the module synchronously and
# return the results to the client.
# 2. "async": return 404, but asynchronously store the module
# in the storage backend.
# 3. "redirect": return a 301 redirect status to the client
# with the base URL as the DownloadRedirectURL from below.
# 4. "async_redirect": same as option number 3 but it will
# asynchronously store the module to the backend.
# 5. "none": return 404 if a module is not found and do nothing.
# 6. "file:<path>": will point to an HCL file that specifies
# any of the 5 options above based on different import paths.
# 7. "custom:<base64-encoded-hcl>" is the same as option 6
# but the file is fully encoded in the option. This is
# useful for using an environment variable in serverless
# deployments.
# Env override: ATHENS_DOWNLOAD_MODE
DownloadMode = "sync"

通過環(huán)境變量 ATHENS_DOWNLOAD_MODE 可指定,也可以修改指定的 config.dev.toml來配置,默認(rèn)是 sync

ATHENS_DOWNLOAD_MODE 可指定的內(nèi)容:

1、通過 file:<path>指定一個(gè) hcl 文件,里面可以對(duì)不同的倉(cāng)庫(kù),設(shè)置下載模式;

2、通過 custom:<base64-encoded-hcl> 指定一個(gè) base64 編碼的 HCL 文件;

3、指定具體的全局策略,sync, async, none, redirect, or async_redirect,這是一個(gè)全局的設(shè)置,上面的兩種是可以定制策略組的。

來看下具體的下載模式

  • sync: 通過 同步從 VCS 下載模塊 go mod download,將其持久化到存儲(chǔ)中,并立即將其返回給用戶。請(qǐng)注意,這是默認(rèn)行為;

  • async:向客戶端返回 404,并異步下載 module@version 并將其持久化到存儲(chǔ)中;

  • none:返回 404 并且什么也不做;

  • redirect:重定向到上游代理(例如proxy.golang.org),之后什么也不做;

  • async_redirect:重定向到上游代理(例如proxy.golang.org)并異步下載 module@version 并將其持久化到存儲(chǔ)中;

下面看下配置策略的 hcl 文件

# cat download.hcl  
downloadURL = "https://goproxy.cn"
mode = "async_redirect"
download "gitlab.test.com/*" {
    mode = "sync"
}

部署

這里使用 docker-composer 部署

version: '2'
services:
  athens:
    image: gomods/athens:v0.11.0
    restart: always
    container_name: athens_proxy
    ports:
      - "3000:3000"
    volumes:
      - ./.netrc:/root/.netrc
      - ./athens-storage:/var/lib/athens
      - ./download.hcl:/root/download.hcl
    environment:
      - ATHENS_NETRC_PATH=/root/.netrc
      - ATHENS_STORAGE_TYPE=disk
      - ATHENS_DISK_STORAGE_ROOT=/var/lib/athens
      - ATHENS_GOGET_WORKERS=100
      - ATHENS_DOWNLOAD_MODE=file:/root/download.hcl
      - ATHENS_GONOSUM_PATTERNS=gitlab.test.com

ATHENS_GONOSUM_PATTERNS:配置為私庫(kù)地址,配置的倉(cāng)庫(kù)地址,不會(huì)進(jìn)行安全向校驗(yàn)。

go 處于安全性考慮,為了保證開發(fā)者的依賴庫(kù)不被人惡意劫持篡改,所以引入了 GOSUMDB 環(huán)境變量來設(shè)置校驗(yàn)服務(wù)器

當(dāng)你在本地對(duì)依賴進(jìn)行變動(dòng)(更新/添加)操作時(shí),Go 會(huì)自動(dòng)去這個(gè)服務(wù)器進(jìn)行數(shù)據(jù)校驗(yàn),保證你下的這個(gè)代碼庫(kù)和世界上其他人下的代碼庫(kù)是一樣的。如果有問題,會(huì)有個(gè)大大的安全提示。當(dāng)然背后的這些操作都已經(jīng)集成在 Go 里面了,開發(fā)者不需要進(jìn)行額外的操作。

對(duì)于我們的私有倉(cāng)庫(kù),去公共安全校驗(yàn)庫(kù)校驗(yàn),肯定是不能通過校驗(yàn)的,我們可以通過 ATHENS_GONOSUM_PATTERNS 這個(gè)環(huán)境變量來設(shè)置不做校驗(yàn)的代碼倉(cāng)庫(kù), 它可以設(shè)置多個(gè)匹配路徑,用逗號(hào)相隔。

啟動(dòng) docker-compose up -d

客戶端設(shè)置代理 export GOPROXY=http://xxxx:3000

這樣就能使用我們的代理服務(wù)了

因?yàn)檫x擇的 ATHENS_STORAGE_TYPE 為 disk,athens 服務(wù)會(huì)在拉取資源包的同時(shí),也會(huì)下載資源包到配置的 ATHENS_DISK_STORAGE_ROOT 中。

使用秘鑰的方式認(rèn)證私有倉(cāng)庫(kù)

上面通過 .netrc 的方式來認(rèn)證私有倉(cāng)庫(kù),因?yàn)橘~號(hào)密碼是銘文的總歸不太好,可以使用秘鑰的方式來認(rèn)證

1、配置秘鑰

首先查看電腦有沒有秘鑰

# cd .ssh
# ls
id_rsa		id_rsa.pub

沒有的話通過下面的命令的生成

# ssh-keygen -t rsa -C "youremail@example.com"

郵箱換成自己的,一路回車即可

然后將 id_rsa.pub 公鑰的內(nèi)容添加到自己的私有倉(cāng)庫(kù)中,如何添加自己 google 吧,比較簡(jiǎn)單

2、配置 HTTP 與 SSH 重寫規(guī)則

# cat gitconfig 
[url "ssh://git@gitlab.test.com"]
        insteadOf = https://gitlab.test.com

3、配置 SSH 來繞過主機(jī) SSH 鍵驗(yàn)證

# cat config 
Host gitlab.test.com
Hostname gitlab.test.com
StrictHostKeyChecking no
IdentityFile /root/.ssh/id_rsa

將上面配置的認(rèn)證信息,映射到容器中即可

version: '2'
services:
  athens:
    image: gomods/athens:v0.11.0
    restart: always
    container_name: athens_proxy
    ports:
      - "3000:3000"
    volumes:
      - ./athens-storage:/var/lib/athens
      - ./download.hcl:/root/download.hcl
      - ./gitconfig:/root/.gitconfig
      - ./ssh-keys:/root/.ssh
    environment:
      - ATHENS_STORAGE_TYPE=disk
      - ATHENS_DISK_STORAGE_ROOT=/var/lib/athens
      - ATHENS_GOGET_WORKERS=100
      - ATHENS_DOWNLOAD_MODE=file:/root/download.hcl
      - ATHENS_GONOSUM_PATTERNS=gitlab.test.com

這樣即可實(shí)現(xiàn)秘鑰的認(rèn)證了

需要注意私鑰的權(quán)限,剛開始沒注意,執(zhí)行報(bào)了下面的錯(cuò)誤

        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        @         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        Permissions 0644 for '/root/.ssh/id_rsa' are too open.
        It is required that your private key files are NOT accessible by others.
        This private key will be ignored.
        Load key "/root/.ssh/id_rsa": bad permissions
        git@gitlab.test.com: Permission denied (publickey).
        fatal: Could not read from remote repository.

看報(bào)錯(cuò)就可推斷出,是權(quán)限太大了,需要私鑰文件不能被其他人所訪問。

修改權(quán)限就可以了

ssh-keys # chmod 600 id_rsa

讀到這里,這篇“怎么使用docker compose部署golang的Athens私有代理”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI