مقدمه
گوماژولها (Go Modules) سیستم مدیریت وابستگی رسمی زبان Go هستند. وقتی یک پروژه Go میسازید، دستور go build ماژولهای مورد نیاز را از مخازن عمومی مثل proxy.golang.org و sum.golang.org دانلود میکند. اما در محیطهای ایزوله (Airgap) که به اینترنت دسترسی ندارید — مثل شبکههای داخلی سازمانی، دیتاسنترهای نظامی یا زیرساخت ابری خصوصی — نیاز به یک پروکسی داخلی دارید که ماژولها را کش کرده و در اختیار توسعهدهندگان بگذارد. به این کار اصطلاحاً Go Module Proxy یا Mirror میگویند. در این مقاله دو روش رایج برای راهاندازی آن معرفی میشود.
روش اول: Athens Proxy
Athens محبوبترین پروکسی self-hosted برای گوماژولهاست. با Docker به سادگی راه میافتد:
docker run -d -p 3000:3000 --name athens-proxy gomods/athens:latestبهطور پیشفرض Athens ماژولها را در حافظه نگه میدارد. برای ذخیرهسازی پایدار روی دیسک، متغیرهای محیطی زیر را تنظیم کنید:
ATHENS_STORAGE_TYPE=disk
ATHENS_DISK_STORAGE_ROOT=/var/lib/athensاگر فقط اجازه دانلود ماژولهای خاصی را میدهید (مثلاً ماژولهای متنباز تأییدشده)، از GO_PROXY_ALLOWLIST استفاده کنید. در غیر این صورت پروکسی را باز بگذارید تا همه ماژولهای عمومی را کش کند. همچنین میتوانید Athens را از باینری یا سورس نصب کنید و با فایل کانفیگ اختصاصی (config.toml) راهاندازی نمایید.
روش دوم: GOPROXY با nginx cache
اگر به یک راهحل سبکتر نیاز دارید، میتوانید nginx را بهعنوان یک caching reverse proxy در مقابل proxy.golang.org قرار دهید. این روش برای تیمهای کوچک یا راهاندازی سریع非常适合 است:
proxy_cache_path /var/cache/nginx/go-proxy levels=1:2 keys_zone=go_cache:10m max_size=10g;
server {
listen 8080;
location / {
proxy_pass https://proxy.golang.org;
proxy_cache go_cache;
proxy_cache_valid 200 7d;
proxy_ignore_headers Cache-Control Expires Set-Cookie;
proxy_ssl_verify on;
}
}با این تنظیمات nginx پاسخهای موفق (HTTP 200) را تا ۷ روز کش میکند. حجم کش به ۱۰ گیگ محدود شده که برای بیشتر تیمها کافی است. مزیت این روش سادگی و عدم نیاز به نصب سرویس جداگانه است.
تنظیمات سمت کلاینت
پس از راهاندازی پروکسی، هر توسعهدهنده باید متغیر محیطی GOPROXY را به آدرس پروکسی داخلی تنظیم کند:
export GOPROXY=http://YOUR_PROXY_IP:3000,directاگر سرویس Checksum DB (sum.golang.org) هم در محیط شما در دسترس نیست، باید آن را غیرفعال کنید:
export GONOSUMCHECK=*
export GONOSUMDB=*همچنین اگر از مخازن خصوصی استفاده میکنید (مثلاً GitLab داخلی)، آنها را با GOPRIVATE مشخص کنید تا Go مستقیماً به آنها وصل شود و از پروکسی عبور نکند:
export GOPRIVATE=*.internal.company.comنکته مهم: این متغیرها را میتوانید در ~/.bashrc، ~/.zshrc یا در پایپلاین CI/CD تنظیم کنید تا تمام اعضای تیم از یک پروکسی واحد استفاده کنند.
جمعبندی
در محیطهای Airgap، Athens Proxy گزینهای کامل و انعطافپذیر است، درحالیکه nginx cache راهحلی ساده و سریع برای تیمهای کوچک محسوب میشود. انتخاب نهایی به نیاز شما از نظر مقیاس، امکانات و نگهداری بستگی دارد. پس از راهاندازی، با تنظیم GOPROXY تمام اعضای تیم میتوانند بدون نیاز به اینترنت به build پروژههای Go ادامه دهند.