Chuyển đến nội dung chính

Hướng dẫn deploy

Deploy Go lên TOSE

Biên dịch binary Go tĩnh trong stage build, rồi copy vào image Alpine nhỏ chạy bằng user không phải root.

Trước khi bắt đầu

  • Một Go module (go.mod) nằm trong repository GitHub.
  • Server đọc cổng từ PORT hoặc lắng nghe cổng 3000.
  • Tài khoản TOSE và một workspace trên app.tose.sh, repository đã kết nối qua TOSE GitHub App.
  • Node.js để cài TOSE CLI: npm install -g @tosesh/tose. Bạn cũng có thể làm mọi bước trên dashboard.

Ví dụ

Đây là các file của ứng dụng mẫu trong repository tose-web. Bài test của nó build image cho linux/amd64, chạy container và gọi thử trang.

Dockerfile
FROM golang:1.25-alpine AS build
WORKDIR /src
COPY go.mod ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /out/app .

FROM alpine:3.22
RUN adduser -D app
USER app
COPY --from=build /out/app /app
ENV PORT=3000
EXPOSE 3000
CMD ["/app"]
main.go
package main

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

func main() {
	port := os.Getenv("PORT")
	if port == "" {
		port = "3000"
	}
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintln(w, "Hello from Go on TOSE")
	})
	// An empty host listens on every interface, including 0.0.0.0.
	log.Fatal(http.ListenAndServe(":"+port, nil))
}

Deploy

  1. 1. Đặt Dockerfile ở thư mục gốc của repository

    TOSE build file tên Dockerfile ở thư mục gốc của repository.

  2. 2. Kiểm tra image trên máy

    TOSE build cho linux/amd64. Hãy build cho cùng nền tảng rồi mở http://localhost:3000.

    docker build --platform linux/amd64 -t my-app .
    docker run --rm -p 3000:3000 my-app
  3. 3. Tạo project

    Trên dashboard, tạo project từ repository GitHub và giữ cổng 3000, hoặc chạy tose up trong repository và trả lời các câu hỏi. Bước này chỉ làm một lần.

    tose up
  4. 4. Deploy và kiểm tra

    Các lần deploy sau chỉ cần một lệnh. Xem log build khi build lỗi, xem log đang chạy khi ứng dụng không phản hồi.

    tose deploy my-workspace/my-app --json
    tose status my-workspace/my-app --json
    tose logs my-workspace/my-app --build -n 200
    tose logs my-workspace/my-app -n 100
  5. 5. Đặt biến môi trường

    Chọn project, đặt biến rồi redeploy để container khởi động với các biến đó. Không commit secret vào repository.

    tose use my-workspace/my-app
    tose env set DATABASE_URL=… API_BASE_URL=…
    tose redeploy

app.tose.sh

Lưu ý cho stack này

  • CGO_ENABLED=0 tạo binary tĩnh chạy được trên Alpine mà không cần glibc.
  • Lắng nghe ":" + port để nhận kết nối trên mọi interface. "localhost:3000" chỉ nhận kết nối từ bên trong container.

Kích thước và chi phí

  • Project mới có 1 vCPU, 2 GB RAM và 1 replica. Bạn có thể đổi vCPU và RAM trên dashboard trong các mức 0.5, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 16.
  • Khi ví của workspace chưa có số dư dương, mỗi project dùng tối đa 2 vCPU và 2 GB RAM.
  • Với giá cơ bản, kích thước mặc định tốn $29.20 cho một tháng 730 giờ.

Bảng giá và công cụ tính

Khi có lỗi

"no Dockerfile in project and OPENROUTER_KEY not configured for AI generation"
TOSE không tìm thấy Dockerfile. Thêm file tên đúng là Dockerfile ở thư mục gốc của repository.
"AI Dockerfile generation failed"
TOSE không tự tạo được Dockerfile cho repository này. Hãy commit Dockerfile của bạn, bắt đầu từ ví dụ trên trang này.
Deploy xong nhưng ứng dụng không phản hồi hoặc liên tục khởi động lại
Ứng dụng phải lắng nghe trên 0.0.0.0 và đúng cổng của project (mặc định 3000). TOSE không tự đặt PORT; hãy đặt trong Dockerfile hoặc bằng tose env set. Xem tose logs để biết lỗi.
Build dừng mà code của bạn không báo lỗi
Mỗi lần build có 2 GB bộ nhớ, 2 CPU và 45 phút. Giảm bộ nhớ khi build (ví dụ ít job song song hơn) hoặc cài ít dependency hơn.
"exec format error" khi container khởi động
Image hoặc binary bên trong không dành cho linux/amd64. Dùng base image có bản amd64 và không ép nền tảng khác.

Tiếp theo