پرش به مطلب اصلی

محیط اجرای Go

ویدیو: استقرار اپلیکیشن Go روی ابرکلیکplaceholder — ویدیو را اینجا جایگزین کنید

ابرکلیک از استقرار و اجرای کارآمد پروژه‌های Go پشتیبانی می‌کند. بیلدپک ابرکلیک سورس‌کد شما را تحلیل کرده و یک کانتینر سبک و امن برای پروداکشن تولید می‌کند.


تشخیص خودکار پروژه (Detection)

ابرکلیک پروژه‌های نوشته‌شده با زبان Go را از وجود موارد زیر در ریشه پروژه شناسایی می‌کند:

  • فایل go.mod در پوشه ریشه پروژه.
  • فایل‌های با پسوند .go حاوی سورس‌کد اصلی.

فرآیند ساخت و بیلد (Build Process)

۱. تحلیل پروژه: بیلدپک وجود فایل‌های go.mod و کدهای پروژه را تایید می‌کند. ۲. ساخت داکرفایل چندمرحله‌ای بهینه (Multi-stage Dockerfile): سیستم یک فایل داکربیلد فوق‌العاده بهینه با متد چندمرحله‌ای ایجاد می‌کند. ۳. کامپایل سورس‌کد (Build Stage): کدها با فلگ CGO_ENABLED=0 به‌صورت کامپایل ثابت (Statically Linked Binary) کامپایل می‌شوند تا وابستگی به سیستم‌عامل میزبان به صفر برسد. ۴. مرحله نهایی زمان اجرا (Runtime Stage): خروجی باینری تمیز به یک توزیع مینی‌مال (مانند scratch یا alpine) فرستاده می‌شود تا حجم نهایی به کمترین میزان ممکن (گاهی کمتر از ۱۰ مگابایت) برسد.

نمونه داکرفایل بهینه تولیدشده توسط بیلدپک

FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY . .
RUN go mod download
RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o app .

# مرحله اجرای تمیز (Runtime Stage)
FROM scratch
COPY --from=builder /app/app /app
EXPOSE 8080
CMD ["/app"]

متغیرهای محیطی رایج در Go

برای تنظیم و اعمال پیکربندی‌ها در فرآیند اجرا از متغیرهای محیطی استفاده کنید:

abrclick env set GO_ENV=production
abrclick env set PORT=8080
abrclick env set LOG_LEVEL=info
متغیر محیطیمقدار پیش‌فرضتوضیحات فنی
PORT8080پورتی که اپلیکیشن شما باید روی آن گوش بدهد
GO_ENVproductionوضعیت لود برنامه (محیط پروداکشن یا دولوپ)
LOG_LEVELinfoسطح تفکیک لاگ‌ها

تنظیم آدرس پورت لیسنر (Port Configuration)

بسیار مهم: وب‌سرور شما حتماً باید بر روی پورت مشخص‌شده در متغیر محیطی PORT بالا بیاید. برای اجرای درست این ساختار در زبان Go از پترن زیر استفاده کنید:

package main

import (
"fmt"
"net/http"
"os"
)

func main() {
// خواندن پورت پویا از متغیرهای محیطی پلتفرم
port := os.Getenv("PORT")
if port == "" {
port = "8080" // پورت پشتیبان برای حالت لوکال
}

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "سلام از دنیای Go روی ابرکلیک!")
})

// راه‌اندازی سرور روی پورت تزریق شده
http.ListenAndServe(":"+port, nil)
}

ملزومات مدیریت پکیج‌ها (Go Modules)

مطمئن شوید که پروژه شما حتماً از ساختار رسمی Go Modules استفاده می‌کند:

go mod init example.com/myapp
go mod tidy

حتماً فایل‌های go.mod و go.sum را به گیت خود متعهد (Commit) کنید تا سرور بیلدپک بتواند وابستگی‌ها را به درستی دانلود و کش کند.


راهکارهای فشرده‌سازی و بهینه‌سازی در بیلدپک Go

سیستم بیلدپک به‌طور هوشمند ترفندهای زیر را برای اجرای بهینه برنامه Go شما اعمال می‌کند:

  • متد بیلد چندمرحله‌ای (Multi-stage): کاهش حدود ۹۰ درصدی حجم نهایی کانتینر با حذف ابزارهای کامپایل و کامپایلر گو از خروجی زمان اجرا.
  • غیرفعال‌سازی CGO: بیلد کامپایلر کاملاً مستقل و قابل حمل (Portable static binary) بدون نیاز به glibc.
  • حذف سمبل‌ها و لاگ‌های بیلد: استفاده از پارامتر -ldflags="-s -w" برای کاهش فشرده حجم باینری و بهینه‌سازی سرعت لود پادها در کوبرنتیز.

اتصال دیتابیس‌ها و استفاده از آن در Go

با لینک کردن بانک اطلاعاتی به برنامه، اطلاعات کاربری در قالب متغیرهای زیر به پاد برنامه تزریق می‌شوند:

abrclick db link <app-id> <database-id>

نمونه رشته‌های تزریق‌شده:

DATABASE_URL=postgresql://user:pass@host:5432/db

نمونه کدهای اتصال به دیتابیس PostgreSQL در Go

package main

import (
"database/sql"
"os"

_ "github.com/lib/pq"
)

func main() {
// استفاده مستقیم از متغیر محیطی تزریق‌شده
dbURL := os.Getenv("DATABASE_URL")
db, err := sql.Open("postgres", dbURL)
if err != nil {
panic(err)
}
defer db.Close()

// اجرای کوئری‌ها بر روی دیتابیس...
}

مشاهده لاگ‌ها

برای بررسی لاگ‌های برنامه Go خود، از دستور زیر استفاده کنید:

abrclick logs <app>

این دستور لاگ‌های زمان اجرا را به‌صورت زنده نمایش می‌دهد. لاگ‌های بیلد نیز در حین اجرای abrclick deploy استریم می‌شوند.

همچنین می‌توانید لاگ‌ها را از داشبورد مشاهده کنید: وارد صفحه برنامه شوید و بر روی تب لاگ‌ها کلیک کنید.

نکته فنی

در برنامه‌های سالم Go، معمولاً پیام شروع سرور را خواهید دید که شما خودتان آن را لاگ کرده‌اید (مثلاً Server listening on :8080 یا Starting server on port 8080). اگر پیامی نبینید یا پیام خطا دریافت کنید، احتمالاً برنامه در حال راه‌اندازی با مشکل مواجه شده است.

برای اطلاعات بیشتر، راهنمای کامل لاگ‌ها را مطالعه کنید.


رفع خطاهای رایج

اپ بالا نمی‌آید / پورت اشتباه

علت: برنامه شما بر روی پورت ثابت (مثلاً 8080) یا آدرس 127.0.0.1 گوش می‌دهد. پلتفرم ترافیک را به پورت تزریق‌شده در متغیر محیطی PORT هدایت می‌کند.

راه‌حل: مطمئن شوید برنامه شما از os.Getenv("PORT") برای خواندن پورت استفاده می‌کند و بر روی آدرس 0.0.0.0 یا بدون تعیین host گوش می‌دهد:

port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
http.ListenAndServe(":"+port, nil)

بیلد ناموفق / go.mod پیدا نشد

علت: پروژه شما از ساختار Go Modules استفاده نمی‌کند یا فایل go.mod وجود ندارد. بیلدپک برای بیلد نیاز به وجود این فایل دارد.

راه‌حل: مطمئن شوید فایل‌های go.mod و go.sum در ریشه پروژه موجود هستند و آن‌ها را کامیت کنید:

go mod init example.com/myapp
go mod tidy
git add go.mod go.sum

خطای CGO / وابستگی‌های سیستم

علت: برنامه شما به کتابخانه‌های سیستم (مثلاً glibc) وابسته است و در محیط مینیمال (مانند scratch) اجرا نمی‌شود. به‌طور پیش‌فرض، بیلدپک ابرکلیک با CGO_ENABLED=0 بیلد می‌کند تا باینری کاملاً مستقل (statically linked) تولید کند.

راه‌حل: اگر پروژه شما نیاز به CGO ندارد، این مشکل نباید رخ دهد. اگر نیاز دارید، Dockerfile سفارشی بنویسید که از تصویر پایه بزرگ‌تر (مثلاً alpine) استفاده کند و CGO را فعال کنید.

OOMKilled / خطای حافظه

علت: برنامه شما از حافظه بیشتر از محدودیت تعریف‌شده (پیش‌فرض ۵۱۲Mi) استفاده کرده است.

راه‌حل: محدودیت حافظه برنامه را از طریق داشبورد یا تغییر پلن افزایش دهید. همچنین می‌توانید استفاده از حافظه در کد خود را بهینه‌سازی کنید.