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.
Có sẵn file HTML, chỉ cần upload
nginx + your /public folder
App đã có ở GitHub → 1 click deploy
node20 + Next.js standalone
Chỉ paste URL image vào Zeni
gcr.io/... or docker.io/...
"Hello World" / "FastAPI" / "Express"
1-click no-config
Không cần code, không cần config. Click 1 phát có URL public.
Trong form deploy, dùng các thông số mẫu sau:
| Trường | Giá trị |
|---|---|
| Tên | my-first-app |
| Type | web |
| Runtime | container |
| Size | s (512MB, đủ cho hello world) |
| Region | asia-southeast1 (Singapore, gần VN) |
| Image | gcr.io/google-samples/hello-app:1.0 |
| Port | 8080 |
| Allow public | ✓ checked |
deploying → running. Sau đó click vào project xem URL public dạng https://zeni-{ws}-{name}-xxx.run.app.
image bằng image của riêng bạn để deploy app thật.
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
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
Vào Dashboard → "+ Project mới" → paste URL image vừa push → port 80 → Deploy.
Trong next.config.js thêm:
module.exports = {
output: 'standalone',
}
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"]
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.
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)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
}'
Khi deploy có 2 cách truyền config:
"env_vars": {
"NODE_ENV": "production",
"API_BASE_URL": "https://api.example.com"
}
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"
}
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.
Vào DNS provider (Cloudflare, Namecheap, GoDaddy...) → add CNAME:
myapp.com (hoặc www)CNAMEghs.googlehosted.comPOST /api/v1/projects/{project_id}/domain/verify
Sau khi verify OK → SSL Let's Encrypt tự generate trong 1-2 phút.
Image của bạn không nằm trong whitelist. Cách giải quyết:
docker.io/yourname/image:tagdocker.io/library/nginxCheck chi tiết error qua GET /api/v1/projects/{id}. Lý do thường:
0.0.0.0:8080 (không phải localhost)s → m hoặc lBackend bug — báo support kèm request_id trong response header.