🚀 Deploy app trong 60 giây

Hướng dẫn từng bước cho người chưa từng dùng cloud — không cần biết Docker, không cần Linux. Chọn 1 trong 4 cách bên dưới.

✅ Free trial 14 ngày: Đăng ký tài khoản → 14 ngày dùng full Pro miễn phí, không cần thẻ.

Chọn cách deploy phù hợp

📄

Static HTML/CSS

Có sẵn file HTML, chỉ cần upload

nginx + your /public folder

Next.js

App đã có ở GitHub → 1 click deploy

node20 + Next.js standalone
🐳

Có sẵn Docker image

Chỉ paste URL image vào Zeni

gcr.io/... or docker.io/...
🎯

Template có sẵn

"Hello World" / "FastAPI" / "Express"

1-click no-config

🎯 Cách 1 — Deploy template có sẵn (DỄ NHẤT)

Không cần code, không cần config. Click 1 phát có URL public.

1

Vào Dashboard → Tab "Projects"

Mở zenicloud.io/app → click "+ Project mới" ở góc trên phải.
2

Chọn template "Hello World"

Trong form deploy, dùng các thông số mẫu sau:

TrườngGiá trị
Tênmy-first-app
Typeweb
Runtimecontainer
Sizes (512MB, đủ cho hello world)
Regionasia-southeast1 (Singapore, gần VN)
Imagegcr.io/google-samples/hello-app:1.0
Port8080
Allow public✓ checked
3

Click "Deploy" — chờ 30-60 giây

Status sẽ chuyển deployingrunning. Sau đó click vào project xem URL public dạng https://zeni-{ws}-{name}-xxx.run.app.
✅ Done! App đã LIVE. Bây giờ thay image bằng image của riêng bạn để deploy app thật.

📄 Cách 2 — Deploy site HTML/CSS sẵn có

1

Tạo Dockerfile đơn giản

Trong folder website của bạn, tạo file tên Dockerfile (không có đuôi):

FROM nginx:alpine
COPY . /usr/share/nginx/html
EXPOSE 80
2

Build + push image lên Docker Hub

Cần cài Docker trên máy. Chạy 3 lệnh:

# 1. Build image (đặt tên theo username Docker Hub của bạn)
docker build -t myname/my-site:v1 .

# 2. Login Docker Hub (1 lần)
docker login

# 3. Push lên
docker push myname/my-site:v1

Image URL của bạn: docker.io/myname/my-site:v1

3

Deploy trên Zeni Cloud

Vào Dashboard → "+ Project mới" → paste URL image vừa push → port 80 → Deploy.

▲ Cách 3 — Deploy Next.js từ GitHub

1

Setup Next.js standalone build

Trong next.config.js thêm:

module.exports = {
  output: 'standalone',
}
2

Tạo Dockerfile

FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
COPY --from=builder /app/public ./public
EXPOSE 3000
CMD ["node", "server.js"]
3

Build + push + deploy

docker build -t myname/my-nextjs:v1 .
docker push myname/my-nextjs:v1

Trên Zeni Cloud: deploy với image docker.io/myname/my-nextjs:v1, port 3000.

🐳 Cách 4 — Có sẵn Docker image

1

Image phải public hoặc trong Artifact Registry Zeni

Image phải đến từ 1 trong:

  • gcr.io/zeni-cloud-core/... (Artifact Registry của Zeni)
  • gcr.io/google-samples/... (Google samples public)
  • docker.io/library/... (Docker Hub official: nginx, redis, postgres, node...)
  • docker.io/{user}/... (Docker Hub public của bạn)
2

API call deploy

curl -X POST "https://zenicloud.io/api/v1/projects?ws=YOUR_WS" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "my-app",
    "type": "api",
    "runtime": "container",
    "size": "m",
    "region": "asia-southeast1",
    "image": "docker.io/library/nginx:alpine",
    "port": 80,
    "env_vars": {"NODE_ENV":"production"},
    "allow_unauthenticated": true
  }'

🔧 Env vars + Secrets

Khi deploy có 2 cách truyền config:

Plain env vars (không nhạy cảm)

"env_vars": {
  "NODE_ENV": "production",
  "API_BASE_URL": "https://api.example.com"
}

Secrets (API keys, passwords — encrypt qua KMS)

Bước 1: Tạo secret trong Settings → Identity → Secrets:

POST /api/v1/identity/secrets?ws=YOUR_WS
{ "name":"db-password", "value":"super-secret-123" }

Bước 2: Reference khi deploy:

"secrets": {
  "DB_PASSWORD": "db-password:latest"
}

🌐 Custom domain

1

Map domain trong Zeni

POST /api/v1/projects/{project_id}/domain?ws=YOUR_WS
{ "domain": "myapp.com" }

Zeni sẽ trả về 1 record CNAME cần add vào DNS provider của bạn.

2

Add CNAME record vào DNS

Vào DNS provider (Cloudflare, Namecheap, GoDaddy...) → add CNAME:

  • Name: myapp.com (hoặc www)
  • Type: CNAME
  • Target: ghs.googlehosted.com
  • TTL: 3600
3

Verify (sau 5-10 phút DNS propagate)

POST /api/v1/projects/{project_id}/domain/verify

Sau khi verify OK → SSL Let's Encrypt tự generate trong 1-2 phút.

🔧 Lỗi thường gặp

❌ "Image phải từ Artifact Registry zeni-cloud-core, Docker Hub library, hoặc Google samples"

Image của bạn không nằm trong whitelist. Cách giải quyết:

❌ Deploy status "failed"

Check chi tiết error qua GET /api/v1/projects/{id}. Lý do thường:

❌ HTTP 500 khi gọi API

Backend bug — báo support kèm request_id trong response header.

🎓 Tiếp theo nên học gì?

🗄️

L2 Data — Vector DB + Cache

Lưu data + RAG pipeline cho AI

🤖

L3 AI — ZeniRouter

Smart route Claude/GPT/Gemini

🔐

L5 Identity — OAuth

Login Google/GitHub/Zalo cho khách

📚

Master Guide

Toàn bộ 6 lục đạo + workflows

🚀 Vào Dashboard deploy ngay ✉️ Hỏi support