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.
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"]/** @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;node_modules
.nextDeploy
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. 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-app3. 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 up4. 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 1005. Đặ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
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ờ.
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.