> Hướng dẫn deploy dự án có Dockerfile lên MONA Cloud: chuẩn bị Dockerfile, lệnh CLI --build dockerfile, MCP, API, kiểm tra container, đổi env và domain. Nguồn: https://monacloud.vn/deploy-docker · Cập nhật: 2026-09-19 # Deploy app bằng Dockerfile lên VPS Dự án có Dockerfile ở bất kỳ ngôn ngữ nào deploy từ thư mục trên máy hoặc repo public qua CLI, MCP hoặc API đã LIVE với --build dockerfile, nhận URL HTTPS. App host tính phí như VPS, app không tính thêm; repo private đang mở. ## Cần chuẩn bị gì trong Dockerfile? Đọc Dockerfile (base image, lệnh CMD, cổng EXPOSE), .dockerignore loại node_modules/, .git/, .env* để archive dưới 80 MB, biến môi trường cần khai lại, và thư mục ghi dữ liệu: dữ liệu trong container mất khi deploy lại nên dùng database hoặc thư mục gắn ngoài. ## Có những cách deploy Dockerfile nào? Chọn CLI nếu bạn tự chạy lệnh, MCP nếu giao cho AI, API nếu tự viết script. Cả ba cách đều thử được bằng sandbox trước. ### Deploy bằng CLI trong thư mục dự án Chạy `npx -y monacloud deploy` trong thư mục dự án (hoặc `--repo` nếu có GitHub). Đặt `MONACLOUD_TOKEN` trong môi trường theo [bắt đầu nhanh](https://monacloud.vn/docs/bat-dau-nhanh); CLI **monacloud 0.4.1** tự tải MCP qua npx. Chuẩn bị Dockerfile hoặc package.json phù hợp với stack. Thử miễn phí, rồi deploy thư mục hiện tại ``` npx -y monacloud deploy --sandbox npx -y monacloud deploy ``` Lệnh đầu thử miễn phí; sau khi bạn đồng ý với báo giá, lệnh thứ hai upload **thư mục hiện tại** và deploy lên máy chủ tính phí. Mặc định CLI deploy thư mục local kể cả khi có git remote. `--git` dùng remote hiện tại; `--repo ` dùng repo public chỉ định, ví dụ: Deploy repo public trong sandbox ``` npx -y monacloud deploy --repo https://github.com/themonagroup/monacloud-example-node --branch main --build dockerfile --sandbox ``` Bỏ `--sandbox` sau khi đồng ý với báo giá để deploy repo. `--build` nhận `dockerfile`, `nixpacks` hoặc `static`; chọn theo dự án. Repo mẫu trên có sẵn Dockerfile; với dự án của bạn, giữ `--build dockerfile` để hạ tầng build đúng image của bạn. ### Deploy bằng MCP khi giao cho AI MCP **monacloud-mcp 0.5.0** có `cloud_app_detect(local_dir)` đoán stack, port và Dockerfile ngay trên máy; `cloud_app_create({local_dir})` tự đóng zip và upload. Dùng đường dẫn tuyệt đối mà MCP đọc được. Nếu đã tạo bằng CLI, dùng app ID đó để kiểm tra, không tạo trùng. Prompt ngắn cho AI ``` Đưa dự án trong thư mục này lên web bằng MONA Cloud. Token ở biến MONACLOUD_TOKEN. Dùng cloud_app_detect rồi cloud_app_create với local_dir, xong đưa tôi link https. ``` Đọc `cloud_app_list`, `cloud_app_host_list`, `cloud_prices`, `cloud_plan_list` và `cloud_balance` trước khi tạo; số dư đọc qua `/api/me`. Thử `sandbox: true` rồi đồng ý phí app host. Với git public, truyền `repo_url` thay cho `local_dir`. ### Deploy bằng API upload Nếu chọn curl thay MCP hoặc CLI, xem [hai lệnh tạo app và upload](https://monacloud.vn/agent-guide#deploy-từ-thư-mục-local-không-cần-github): `POST /api/apps` với `source: "upload"` không cần `repo_url`, trả `id`, `upload_url`, `max_bytes: 83886080`, `job_id`, `status: "awaiting_upload"` và `url`. Gửi `POST /api/apps/{id}/upload` multipart `archive` (zip hoặc tar.gz tối đa 80 MB) và `build_path` mặc định `/`. Server tự loại `node_modules/`, `.git/`, `.env*`, `*.pem`; chặn zip-slip; **file phải nằm ở gốc archive**, không bọc thêm một thư mục. Upload trả job id, sau đó poll `GET /api/jobs/{id}` tới `succeeded` hoặc `failed`. Đọc `GET /api/apps/{app_id}` và log, kiểm tra HTTPS rồi trả URL. Sandbox dùng `X-Vibecloud-Sandbox: 1` khi tạo app, chỉ mô phỏng, không tính phí và không có website chạy được. Quản lý app tại [console /apps](https://console.monacloud.vn/apps). ## Kết quả mong đợi là gì? | Kết quả mong đợi | Thời gian đo ngày 05/09/2026 (tối) | | --- | --- | | Upload API tới URL HTTPS 200, gồm build image | 112 giây | | MCP `cloud_app_create(local_dir)` tới URL HTTPS, host đã có | 33 giây | | App host đầu tiên | ~150 giây | **Số đo 05/09/2026 (tối):** thời gian đo trên repo mẫu, không phải cam kết thời gian build cho mọi dự án. Thời gian build dự án của bạn phụ thuộc source, dependency và tài nguyên. **App từ git đã LIVE**, đo ngày 05/09/2026: repo git public, app host riêng của bạn (LXC + Dokploy, tạo lần đầu **~150 giây**), deploy **10–20 giây**, URL `https://-.app.monacloud.vn` có chứng chỉ Let's Encrypt. Ví dụ: [monacloud-example-node-3fb5b2.app.monacloud.vn](https://monacloud-example-node-3fb5b2.app.monacloud.vn), từ [repo mẫu Node.js](https://github.com/themonagroup/monacloud-example-node). Xoá app rồi tạo lại mất **31 giây** khi đã có app host. Job tính phí kết thúc ở `succeeded`; trạng thái app là `done`. Sandbox kết thúc ở `done`, có `sandbox: true` và URL giả. Kiểm tra HTTPS và chức năng app trước khi chuyển traffic. ## Kiểm tra container sau khi deploy thế nào? Thử API, webhook, restart và xử lý lỗi. Repo mẫu trong bài là ứng dụng Node.js có Dockerfile dùng để lấy các số đo trên; image của bạn build nhanh hay chậm tuỳ base image và bước cài. Nếu cần database, xem [tạo database](https://monacloud.vn/docs/tao-database). Sandbox chỉ thử API; dữ liệu và chức năng phải kiểm tra trên app đã deploy. ## Lỗi thường gặp khi upload và cách xử lý | Lỗi thường gặp | Cách xử lý | | --- | --- | | Archive bọc thêm thư mục, trả 502 | Đóng lại từ bên trong thư mục dự án để file nằm ngay gốc archive; `build_path` mặc định `/` | | Thiếu Dockerfile | Dùng `cloud_app_detect` để nhận diện stack, chọn `build_type: "nixpacks"` hoặc `--build nixpacks` nếu stack được hỗ trợ, hoặc thêm Dockerfile | | Archive quá 80 MB (83886080 byte) | Loại dependency, cache và file không cần khỏi archive trước khi gửi; server chỉ lọc sau khi nhận, không thay bước giảm dung lượng | ## Cập nhật env, domain và deploy lại thế nào? Dùng `cloud_app_env_set` hoặc `PUT /api/apps/{app_id}/env` với toàn bộ map `env` cần giữ, rồi `cloud_app_deploy` hoặc `POST /api/apps/{app_id}/deploy` để áp dụng. Không commit secret vào repo. `cloud_app_domain_add` hoặc `POST /api/apps/{app_id}/domains` nhận `host`, trả hướng dẫn CNAME. Trỏ DNS đúng đích, chờ cấp chứng chỉ rồi kiểm tra HTTPS. Đọc log bằng `cloud_app_logs` hoặc `GET /api/apps/{app_id}/logs`. Xem [API reference](https://monacloud.vn/docs/api) và [domain và SSL](https://monacloud.vn/docs/domain-va-ssl). ## App host và gói tháng tính phí thế nào? **App host tính phí như VPS, theo giờ hoặc gói tháng; app không tính thêm.** Mặc định tạo host mới dùng 2 core, 2 GB RAM, 30 GB disk: `(2 × 250 + 2 × 150 + 30 × 15) = 1.250đ/giờ`, ước tính **900.000đ/720 giờ**. Đọc giá và cấu hình trả về trước khi đồng ý; dùng lại host sẵn có thì phí host tiếp tục theo kỳ. Để so với VPS tự quản nhỏ: 1 core, 1 GB RAM, 10 GB disk là 550đ/giờ, ước tính `(250 + 150 + 10 × 15) × 720 = 396.000đ/tháng`. Đây là mốc VPS, không phải cấu hình app host mặc định. Bảng giá chính dùng 730 giờ nên VPS đó ra 401.500đ/tháng. Database tách riêng và tài nguyên tăng thêm tính riêng. Gói tháng đã LIVE: **399.000đ, 999.000đ, 1.990.000đ, 3.990.000đ** mỗi tháng; trả năm bằng giá 10 tháng. Khách MONA có gói miễn phí; đăng ký được tặng 100.000đ credit. Hoá đơn VAT 10% mỗi tháng. Xem [gói tháng và hoá đơn](https://monacloud.vn/docs/goi-thang-va-hoa-don) để chọn cấu hình đủ cho app. **Xoá app không xoá app host.** Host còn tồn tại vẫn tính phí; stop giữ disk và IP nên còn phí. Chỉ xoá service host sau khi sao lưu và xác nhận không còn app cần dùng. ## Câu hỏi thường gặp khi deploy bằng Dockerfile **Repo private thì sao?** Repo private đang mở qua GitHub App. Hiện luồng app từ git nhận repo public HTTPS; không đặt token hoặc mật khẩu vào URL repository. Có source trên máy thì dùng local_dir hoặc npx -y monacloud deploy, không cần kết nối GitHub. **Thời gian deploy bao lâu?** Số đo 05/09/2026 (tối): upload API tới HTTPS 200 sau 112 giây, gồm build image; MCP local 33 giây khi host đã có. Host đầu tiên ~150 giây. Git repo mẫu deploy 10–20 giây; xoá app rồi tạo lại 31 giây. Thời gian mỗi dự án có thể khác. **App có tính thêm phí không?** App không tính thêm. App host tính như VPS theo giờ hoặc gói tháng; xoá app vẫn giữ host tính phí. Database riêng tính riêng. **Sandbox có URL chạy được không?** Không. Sandbox miễn phí trả job và URL giả, không chạy source. Chỉ xác nhận app online khi job trả succeeded, app ở trạng thái done và URL HTTPS hoạt động. ## Prompt mẫu cho AI Prompt deploy dự án có Dockerfile · không chứa secret ``` Deploy dự án có Dockerfile trong thư mục hiện tại của tôi lên MONA Cloud (build_type dockerfile) bằng cloud_app_detect rồi cloud_app_create với local_dir. Token ở biến MONACLOUD_TOKEN. Đọc package.json, entry point, script khởi động, cổng lắng nghe, env, thư mục ghi dữ liệu và worker. Đọc cloud_app_list, cloud_app_host_list, cloud_prices, cloud_plan_list và cloud_balance. Chưa có host thì thử sandbox=true; báo phí host giờ/tháng và chờ tôi đồng ý trước khi tạo host tính phí. Poll job, kiểm cloud_app_get, cloud_app_logs và HTTPS rồi trả URL. Thử API, webhook, restart và xử lý lỗi. Repo mẫu trong bài là ứng dụng Node.js có Dockerfile dùng để lấy các số đo trên; image của bạn build nhanh hay chậm tuỳ base image và bước cài. Không đưa secret vào chat. Không cần GitHub khi dùng local_dir. ```