رانتایم Go

هاست Go با باینری استاتیک

سرویس Go با CGO_ENABLED=0 به یک باینری استاتیک کامپایل و روی ایمیج scratch اجرا می‌شود؛ ایمیج نهایی معمولاً چند مگابایت است و در کسری از ثانیه بالا می‌آید.

تشخیص
go.mod
نسخه
از خط go در go.mod (پیش‌فرض 1.22)
ایمیج اجرا
scratch
پورت پیش‌فرض
8080
لوگوی Go

Go همان‌طور که باید اجرا شود

go.mod در ریشه یعنی پروژه‌ی Go. نسخه‌ی کامپایلر از خط go در go.mod خوانده می‌شود، ماژول‌ها از پروکسی داخلی Go دانلود می‌شوند و برنامه با CGO_ENABLED=0 و -ldflags="-s -w" کامپایل می‌شود.

باینری حاصل در یک ایمیج scratch قرار می‌گیرد که جز خود برنامه چیزی ندارد. Gin، Echo، Fiber، Chi و net/http بدون تغییر اجرا می‌شوند؛ فقط پورت را از PORT بخوانید.

مناسب برای

  • API با Gin، Echo یا Fiber
  • سرویس gRPC-Gateway و پروکسی
  • میکروسرویس پرترافیک
  • پردازشگر صف و رویداد

مسیر بیلد Go

  1. تشخیص

    go.mod در ریشه.

    go.mod
  2. دانلود ماژول‌ها

    ماژول‌ها از پروکسی داخلی Go گرفته می‌شوند.

    go mod download
  3. کامپایل

    باینری استاتیک و بدون سمبل ساخته می‌شود.

    CGO_ENABLED=0 go build
  4. اجرا

    باینری روی ایمیج scratch اجرا می‌شود.

    /server

خروجی یک استقرار واقعی

sakoocloud deploy
sakoocloud deploy
✔ Packed 0.1MB
✔ Source uploaded
ℹ Build started · dep_7k2m9q
#4 [builder 1/5] FROM golang:1.22-alpine
#6 [builder 3/5] RUN go mod download
#8 [builder 4/5] RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o /server
#10 [stage-1 1/1] COPY --from=builder /server /server
#12 exporting to image
✔ Deployed — app is running.
→ https://my-go-api.sakooapps.ir

کمترین چیزی که لازم دارید

پورت را از متغیر PORT بخوانید.

package main

import (
	"net/http"
	"os"
)

func main() {
	port := os.Getenv("PORT")
	if port == "" {
		port = "8080"
	}
	http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte(`{"ok":true}`))
	})
	http.ListenAndServe(":"+port, nil)
}

تنظیمات

نسخه‌ی Go

اگر نسخه‌ای اعلام نشود، Go 1.22 استفاده می‌شود.

از کجا خوانده می‌شودنمونه
خط go در go.modgo 1.23
mise.toml یا .tool-versionsgolang 1.23
فلگ --runtime-version--runtime-version 1.23

بیلد

تنظیممقدار
CGOCGO_ENABLED=0
فلگ‌های لینک-ldflags="-s -w"
ایمیج اجراscratch
آرگومان اجرااز خط web: در Procfile

اتصال به دیتابیس

بعد از لینک کردن دیتابیس، DATABASE_URL را با os.Getenv بخوانید.

sakoocloud apps link-db <db-id> --app my-go-api

دیتابیس‌هایی که معمولاً کنارش می‌آیند

همراه هر استقرار

این‌ها به رانتایم بستگی ندارند و برای هر اپ روی سکو کلود فعال‌اند. بعضی، مثل مقیاس‌دهی خودکار و کران‌جاب، به پلن بستگی دارند.

خطاهای رایج

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

علتبرنامه روی پورت ثابت یا فقط روی 127.0.0.1 گوش می‌دهد؛ پلتفرم ترافیک را به پورتِ متغیر PORT می‌فرستد.

راه‌حلپورت را از PORT بخوانید و روی 0.0.0.0 گوش بدهید.

main.go
http.ListenAndServe(":"+os.Getenv("PORT"), nil)

go.mod پیدا نشد

علتپروژه هنوز ماژول Go نیست یا go.mod در زیرپوشه است.

راه‌حلgo mod init را اجرا کنید، یا پوشه را با --root-dir مشخص کنید.

خطای لینک یا کتابخانه‌ی C

علتیکی از وابستگی‌ها به cgo نیاز دارد و با CGO_ENABLED=0 کامپایل نمی‌شود.

راه‌حلنسخه‌ی خالص Go کتابخانه را استفاده کنید، مثلاً modernc.org/sqlite، یا Dockerfile اختصاصی بنویسید.

خطای گواهی TLS در درخواست‌های خروجی

علتایمیج scratch فهرست گواهی‌های ریشه را ندارد مگر آن را کپی کنید.

راه‌حلاگر Dockerfile خودتان را دارید، /etc/ssl/certs را از مرحله‌ی بیلد کپی کنید.

پرسش‌های متداول

کدام فریم‌ورک‌های Go پشتیبانی می‌شوند؟

همه. Gin، Echo، Fiber، Chi یا net/http فرقی ندارد؛ مهم این است که روی PORT گوش بدهید.

اگر چند پکیج main داشته باشم؟

پوشه‌ی سرویس را با --root-dir مشخص کنید یا در Procfile آرگومان اجرا را بدهید.

ایمیج نهایی چقدر است؟

فقط باینری شما؛ معمولاً کمتر از ۲۰ مگابایت، که شروع و مقیاس‌دهی را سریع می‌کند.

جزئیات بیشتر در راهنمای Go در مستندات و مرجع CLI.

سریع‌ترین مسیر از کد تا انتشار.

ابتدا ابزار خط فرمان را نصب کنید، سپس همین‌جا امتحان کنید. (بنویسید، یا یکی از پیشنهادهای پایین ترمینال را بزنید)

~/projects/my-app
امتحان کنید