プライベートな Go モジュールで発生する「410 Gone」エラーの解決方法

intermediate🔷 Go2026-07-28| Go 1.13+, Linux/macOS/Windows, プライベートな GitHub/GitLab/Bitbucket リポジトリ

Error Message

go get: module github.com/your-org/private-repo: reading https://proxy.golang.org/github.com/your-org/private-repo/@v/list: 410 Gone
#golang#go-modules#devops#git

30秒でわかる解決策

このエラーは、パブリックな Go プロキシ(proxy.golang.org)がプライベートコードを参照できないために発生します。これを解決するには、特定の組織に対してプロキシをバイパスするよう Go に指示します。ターミナルで以下のコマンドを実行してください。

go env -w GOPRIVATE=github.com/your-org/*

複数の内部ドメインを使用していますか?その場合はカンマで区切ります。例えば、GitHub とセルフホストの GitLab の両方を使用している場合は、次のように入力します。

go env -w GOPRIVATE=github.com/your-org/*,gitlab.mycompany.com/*

なぜ「410 Gone」が発生するのか?

Go 1.13 のリリース以降、GOPROXY 変数のデフォルトは https://proxy.golang.org,direct になっています。つまり、go get を実行するたびに、マシンはまず Google のパブリックプロキシにコードを問い合わせます。

そのプロキシがプライベートリポジトリを取得しようとすると、認証の壁に突き当たります。このとき、403 Forbidden(プライベートリポジトリの存在を世間に認めてしまうことになる)を返す代わりに、プロキシは 410 Gone を返します。このセキュリティ対策により、プライベートプロジェクトの名前が公開されるのを防いでいます。プロキシは実質的に「これが何であるか分からず、提供することもできない」と言っているのです。

Go のツールチェーンは、この 410 ステータスを受け取ると即座に停止します。どのパスがプライベートであるかを明示的に指定しない限り、直接接続を試みることはありません。

効果的な解決策

1. プライベートドメインを定義する

GOPRIVATE を設定するのが、この問題を解決する最も確実な方法です。これはモジュールパスのバイパスリストとして機能します。パスがこのパターンに一致すると、Go はプロキシとパブリックなチェックサムデータベース(SumDB)を完全に無視します。

特定のリポジトリの場合:

export GOPRIVATE=github.com/username/my-project

組織全体の場合(ベストプラクティス):

go env -w GOPRIVATE=github.com/acme-corp/*

2. Git に SSH 使用を強制する

GOPRIVATE を設定した後でも、ビルドが「terminal prompts disabled(ターミナルプロンプトが無効です)」というエラーで失敗することがあります。これは Go が HTTPS 経由でモジュールを取得しようとする一方で、環境側では SSH キーによる認証を使用しているために発生します。Git の設定を変更して、プロトコルを自動的に切り替えるようにします。

git config --global url."git@github.com:your-org/".insteadOf "https://github.com/your-org/"

このコマンドは Git に対し、「https://github.com/your-org/ へのリクエストがあれば、代わりに git@github.com:your-org/ を使用せよ」と指示します。これにより、Go ツールはローカルの ~/.ssh/id_rsaed25519 キーを使用してログインできるようになります。

3. CI/CD と Docker での対応

GitHub Actions や Jenkins などの自動化環境では、環境が一時的なものであることが多いため、go env -w を使用できません。代わりに、パイプラインスクリプトや Dockerfile 内で標準の環境変数としてこれらを渡します。

Dockerfile のスニペット例:

# 内部モジュールのためにプロキシをバイパスするよう Go を設定
ENV GOPRIVATE=github.com/your-org/*

# プライベートアクセスのためにパーソナルアクセストークン (PAT) を使用
RUN git config --global url."https://${GITHUB_TOKEN}:x-oauth-basic@github.com/your-org/".insteadOf "https://github.com/your-org/"

修正の確認

環境を確認して、設定が有効であることを確認します。

go env GOPRIVATE

次に、詳細(verbose)フラグを付けてモジュールを取得してみます。これにより、Go がファイルの場所をどこに探しに行っているかを正確に確認できます。

go get -v github.com/your-org/private-repo@latest

設定が正しければ、Git がソースプロバイダーから直接リポジトリをクローンしている様子が表示されます。その特定のモジュールに対して proxy.golang.org への参照は表示されなくなります。

よくある間違い

  • 構文エラー: = 記号の周りにスペースがないことを確認してください。ほとんどのシェルでは GOPRIVATE = github... は失敗します。
  • チェックサムの失敗: GONOPROXY を手動で設定しても GONOSUMDB を忘れると、ビルドがクラッシュします。パブリックなチェックサムデータベースはプライベートコードを検証できません。GOPRIVATE を使用すると、これら両方の設定を一度に行えるため推奨されます。
  • ワイルドカードの範囲: モジュールが github.com/org/sub-folder/repo にある場合、ワイルドカード github.com/org/* でカバーされます。しかし、github.com/org(アスタリスクなし)ではカバーされない場合があります。

Related Error Notes