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

Hướng dẫn deploy

Deploy Next.js lên TOSE

Build Next.js ở chế độ standalone để image chỉ chứa server và các file cần thiết, rồi chạy bằng user không phải root trên cổng 3000.

Trước khi bắt đầu

  • Một ứng dụng Next.js có package-lock.json, nằm trong repository GitHub.
  • output: 'standalone' trong next.config.
  • 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 node:22-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci

FROM node:22-alpine AS build
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build

FROM node:22-alpine
WORKDIR /app
ENV NODE_ENV=production PORT=3000 HOSTNAME=0.0.0.0
COPY --from=build --chown=node:node /app/.next/standalone ./
COPY --from=build --chown=node:node /app/.next/static ./.next/static
COPY --from=build --chown=node:node /app/public ./public
USER node
EXPOSE 3000
CMD ["node", "server.js"]
next.config.mjs
/** @type {import('next').NextConfig} */
const nextConfig = {
  // Emits .next/standalone with a minimal server.js and only the files it needs.
  output: 'standalone',
};

export default nextConfig;
.dockerignore
node_modules
.next

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

  • HOSTNAME=0.0.0.0 cho server standalone lắng nghe trên mọi interface. Thiếu biến này, server có thể chỉ bind vào hostname của container và TOSE không kết nối được.
  • Bản build standalone không gồm public/ và .next/static, nên Dockerfile copy cả hai.
  • Biến NEXT_PUBLIC_* được nhúng lúc build. Biến đặt bằng tose env set có khi ứng dụng chạy.

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