مقدمه
در محیطهایی که دسترسی به اینترنت محدود یا قطع است (Airgap)، ابزار go بهطور پیشفرض نمیتواند ماژولها را از مخازن عمومی مثل proxy.golang.org دریافت کند. راهحل استاندارد این است که یک پروکسی داخلی راهاندازی کنید و Go را طوری تنظیم کنید که ماژولها را از همان پروکسی دانلود کند. در این پست قدمبهقدم تنظیمات لازم را مرور میکنیم.
تنظیم GOPROXY
متغیر محیطی GOPROXY مشخص میکند که Go برای دانلود ماژولها به کدام آدرس مراجعه کند. مقدار زیر را به پروکسی داخلی خودتان تنظیم کنید:
export GOPROXY=http://YOUR_PROXY_IP:3000,directبرای ماندگار شدن این تنظیم، خط بالا را به انتهای ~/.bashrc یا ~/.profile اضافه کنید. روش جایگزین استفاده از دستور go env -w است:
go env -w GOPROXY=http://YOUR_PROXY_IP:3000,directاین دستور مقدار را در فایل ~/.config/go/env ذخیره میکند و نیازی به ویرایش دستی ندارد. کلمۀ direct در انتهای مقدار به Go میگوید اگر پروکسی در دسترس نبود، مستقیماً به مخزن اصلی مراجعه کند (که در محیط Airgap معمولاً کار نمیکند، اما بهعنوان fallback مفید است).
غیرفعال کردن checksum database
پایگاه داده checksum گو (sum.golang.org) در محیط Airgap قابل دسترس نیست. اگر آن را غیرفعال نکنیم، دستور go mod download با خطای dial tcp: lookup sum.golang.org متوقف میشود. برای غیرفعال کردن آن:
go env -w GOSUMDB=offاگر میخواهید بررسی checksum فقط برای برخی ماژولها غیرفعال شود، بهجای غیرفعال کردن کامل، الگوها را با GONOSUMDB مشخص کنید:
go env -w GONOSUMDB=*.internal.company.comتوجه: غیرفعال کردن checksum یعنی Go صحت ماژولها را با امضای sum.golang.org تأیید نمیکند؛ در محیطهای حساس، بهتر است پروکسی داخلی شما این تأیید را انجام دهد یا ماژولها از قبل تأیید شده باشند.
تنظیم GOPRIVATE
اگر ماژولهای خصوصی (internal) دارید که در پروکسی عمومی وجود ندارند، باید آنها را با GOPRIVATE به Go معرفی کنید:
export GOPRIVATE=*.internal.company.com,github.com/your-org/*go env -w GOPRIVATE=*.internal.company.com,github.com/your-org/*این متغیر بهطور خودکار مقدار پیشفرض GONOSUMDB (نادیدهگرفتن بررسی checksum) و GONOPROXY (نرفتن به پروکسی) را برای همان الگوها تعیین میکند؛ پس اگر GOPRIVATE را کامل تنظیم کنید، نیازی به تنظیم جداگانۀ آن متغیرها برای ماژولهای خصوصی نیست.
پروکسیهای عمومی Go در دنیا
در ایران پروکسی عمومی و پایداری برای Go وجود ندارد؛ آدرسهایی که گاهی با نامهای ایرانی تبلیغ میشوند، عملاً در دسترس نیستند یا هرگز پایدار نبودهاند و نباید روی آنها حساب کنید. پروکسیهای واقعی و شناختهشدهٔ دنیا اینها هستند:
| نام سرویس | آدرس | توضیحات |
|---|---|---|
| Go Proxy رسمی (Google) | https://proxy.golang.org | پروکسی رسمی گوگل — پیشفرض خود Go |
| Goproxy.cn (Qiniu) | https://goproxy.cn | میزبانیشده توسط Qiniu Cloud چین — پرسرعت در آسیا و بسیار محبوب |
| Goproxy.io | https://goproxy.io | پروکسی جامعه — با سرورهایی برای چین و کاربران جهانی |
| Aliyun Goproxy | https://mirrors.aliyun.com/goproxy/ | آینهٔ ابر علیبابا — سریع برای تیمهای داخل چین |
| Baidu Goproxy | https://goproxy.baidu.com | آینهٔ بایدو — گزینهٔ دیگر برای منطقهٔ آسیا |
برای استفاده از یکی از این پروکسیها (مثلاً در یک محیط با دسترسی انتخابی)، کافی است GOPROXY را تنظیم کنید:
go env -w GOPROXY=https://goproxy.cn,directتوجه: این پروکسیها فقط زمانی کار میکنند که محیط شما بتواند به آنها متصل شود. در یک محیط Airgap کامل، هیچکدام در دسترس نیستند — برای همین راهحل اصلی در ادامه آمده است.
راهحل اصلی برای Airgap: پروکسی خودمیزبان (Athens)
در محیطی که بهکلی از اینترنت قطع است، بهترین روش این است که یک پروکسی خودمیزبان مثل Athens را روی یک ماشین با دسترسی اینترنت راهاندازی کنید، ماژولهای موردنیاز را از قبل دانلود و کش کنید و سپس همهٔ کلاینتها را به آن وصل کنید:
docker run -d -p 3000:3000 -e ATHENS_STORAGE_TYPE=disk -e ATHENS_DISK_STORAGE_ROOT=/var/lib/athens -v /var/lib/athens:/var/lib/athens gomods/athens:latestسپس روی هر کلاینت — بهجای ATHENS_IP، آدرس IP همان ماشین Athens را بنویسید:
go env -w GOPROXY=http://ATHENS_IP:3000
go env -w GOSUMDB=offبا این روش، ابتدا روی ماشین پروکسی go mod download را برای همهٔ پروژهها اجرا میکنید تا کش پر شود، بعد پروکسی را به شبکهٔ داخلی منتقل میکنید یا آنجا نگه میدارید؛ از آن به بعد کلاینتها ماژولها را فقط از همین کش دریافت میکنند.
تست تنظیمات
بعد از اعمال تنظیمات، با دستور زیر صحت عملکرد را بررسی کنید:
go mod downloadهمچنین میتوانید یک پروژۀ آزمایشی ایجاد کنید و با go get یک ماژول ساده مثل github.com/google/uuid را دانلود کنید:
mkdir test-airgap && cd test-airgap
go mod init test-airgap
go get github.com/google/uuidاگر خطایی نبینید، یعنی تنظیمات بهدرستی انجام شده و محیط Go شما برای کار در شرایط Airgap آماده است.