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
تشخیص
go.modدر ریشه.go.modدانلود ماژولها
ماژولها از پروکسی داخلی Go گرفته میشوند.
go mod downloadکامپایل
باینری استاتیک و بدون سمبل ساخته میشود.
CGO_ENABLED=0 go buildاجرا
باینری روی ایمیج scratch اجرا میشود.
/server
خروجی یک استقرار واقعی
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)
}
sakoocloud apps create --name my-go-api --runtime go --port 8080
sakoocloud deploy
تنظیمات
نسخهی Go
اگر نسخهای اعلام نشود، Go 1.22 استفاده میشود.
| از کجا خوانده میشود | نمونه |
|---|---|
خط go در go.mod | go 1.23 |
mise.toml یا .tool-versions | golang 1.23 |
فلگ --runtime-version | --runtime-version 1.23 |
بیلد
| تنظیم | مقدار |
|---|---|
| CGO | CGO_ENABLED=0 |
| فلگهای لینک | -ldflags="-s -w" |
| ایمیج اجرا | scratch |
| آرگومان اجرا | از خط web: در Procfile |
اتصال به دیتابیس
بعد از لینک کردن دیتابیس، DATABASE_URL را با os.Getenv بخوانید.
sakoocloud apps link-db <db-id> --app my-go-api
pool, err := pgxpool.New(ctx, os.Getenv("DATABASE_URL"))
if err != nil {
log.Fatal(err)
}
دیتابیسهایی که معمولاً کنارش میآیند
همراه هر استقرار
اینها به رانتایم بستگی ندارند و برای هر اپ روی سکو کلود فعالاند. بعضی، مثل مقیاسدهی خودکار و کرانجاب، به پلن بستگی دارند.
- دامنهی اختصاصی و SSLدامنه را اضافه کنید؛ گواهی خودکار صادر و تمدید میشود.
- متغیرهای محیطی و سکرتمقادیر رمزگذاریشده فقط در زمان اجرا به اپ میرسند.
- مرحلهی انتشارmigration بعد از بیلد و پیش از جایگزینی نسخهی قبلی اجرا میشود.
- لاگ زندهلاگ بیلد و زمان اجرا، در CLI و کنسول.
- بازگشت به نسخهی قبلهر استقرار قبلی با یک دستور برمیگردد.
- مقیاسدهیمنابع و تعداد نمونهها را تغییر دهید یا خودکارش کنید.
- دیسک ماندگاربرای فایلهایی که باید بعد از هر استقرار بمانند.
- کرانجابدستور زمانبندیشده با همان ایمیج و متغیرها.
- استقرار خودکار با گیتهر push روی شاخهی هدف بیلد و مستقر میشود.
خطاهای رایج
اپ بالا نمیآید یا مدام ریاستارت میشود
علتبرنامه روی پورت ثابت یا فقط روی 127.0.0.1 گوش میدهد؛ پلتفرم ترافیک را به پورتِ متغیر PORT میفرستد.
راهحلپورت را از PORT بخوانید و روی 0.0.0.0 گوش بدهید.
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.