cpanel-deploy
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChinesecPanel — Deploy mã nguồn
cPanel — 部署源代码
Vì toolkit gọi cPanel API từ xa (không SSH), việc đưa file lên server đi theo
luồng: upload archive → giải nén trên server → di chuyển file → ghi file cấu hình.
由于工具包是远程调用cPanel API(无SSH),文件上传到服务器的流程为:上传归档文件 → 在服务器上解压 → 移动文件 → 写入配置文件。
Các lệnh thao tác file
文件操作命令
| Lệnh | Mô tả |
|---|---|
| Upload 1 file local lên server (multipart) |
| Giải nén zip/tar trên server (API2 fileop) |
| Di chuyển/đổi tên file/thư mục |
| Ghi nội dung 1 file text (vd cấu hình) |
| Tạo thư mục |
| Xóa file/thư mục (engine chặn nếu thiếu xác nhận; chạy lại kèm |
| Đổi quyền file (octal 3-4 chữ số, vd 644/0755; cần |
| Đọc lại để kiểm tra |
Đường dẫn server tính tương đối thư mục home (vd , ).
public_htmlpublic_html/blog| 命令 | 描述 |
|---|---|
| 将本地单个文件上传到服务器(多部分上传) |
| 在服务器上解压zip/tar文件(API2 fileop) |
| 移动/重命名文件/文件夹 |
| 写入文本文件内容(例如配置文件) |
| 创建文件夹 |
| 删除文件/文件夹(引擎会拦截未确认的操作;需添加 |
| 修改文件权限(3-4位八进制数,如644/0755;需添加 |
| 读取文件内容用于验证 |
服务器路径以主目录为相对路径(例如、)。
public_htmlpublic_html/blogDeploy WordPress trọn gói (một lệnh)
一键部署完整WordPress
bash
cpanel deploy:wp <docroot> <dbname> <dbuser> <dbpass> [table_prefix]bash
cpanel deploy:wp <docroot> <dbname> <dbuser> <dbpass> [table_prefix]Ví dụ: deploy vào document root chính
示例:部署到主文档根目录
cpanel deploy:wp public_html wpblog wpuser 'M@tKhau#Manh2026'
Lệnh này tự động:
1. Tải `wordpress.org/latest.zip` về máy local.
2. Upload lên `<docroot>` và giải nén trên server.
3. Di chuyển nội dung `wordpress/*` lên `<docroot>`, dọn zip + thư mục thừa.
4. Tạo database + MySQL user + cấp quyền (tự ghép tiền tố `<user>_`).
5. Lấy salt keys chính chủ từ WordPress.org và sinh `wp-config.php`.
Sau khi xong, mở website trên trình duyệt để hoàn tất bước cài đặt WordPress
(chọn ngôn ngữ, tạo tài khoản admin).cpanel deploy:wp public_html wpblog wpuser 'M@tKhau#Manh2026'
该命令会自动执行以下操作:
1. 从`wordpress.org/latest.zip`下载到本地。
2. 上传到`<docroot>`并在服务器上解压。
3. 将`wordpress/*`的内容移动到`<docroot>`,清理多余的zip文件和文件夹。
4. 创建数据库 + MySQL用户 + 授权(自动添加`<user>_`前缀)。
5. 从WordPress.org获取专属salt密钥并生成`wp-config.php`文件。
完成后,在浏览器中打开网站以完成WordPress的安装步骤(选择语言、创建管理员账户)。Deploy static site (HTML/CSS/JS hoặc source build sẵn)
部署静态站点(HTML/CSS/JS或已构建的源代码)
deploy:staticbash
undefineddeploy:staticbash
undefinednén & deploy cả thư mục
压缩并部署整个文件夹
cpanel deploy:static ./dist public_html/static
cpanel deploy:static ./dist public_html/static
hoặc deploy 1 file zip có sẵn
或者部署已有的zip文件
cpanel deploy:static ./build.zip public_html/app
undefinedcpanel deploy:static ./build.zip public_html/app
undefinedDeploy PHP app + MySQL (đã kiểm chứng)
部署PHP应用+MySQL(已验证)
bash
undefinedbash
undefined1. (tùy chọn) tạo subdomain cho app
1.(可选)为应用创建子域名
cpanel subdomain:add php thachtestvibe.dev
cpanel subdomain:add php thachtestvibe.dev
2. tạo database
2. 创建数据库
cpanel db:create phpapp
cpanel db:user-create phpuser '<mật khẩu mạnh>'
cpanel db:grant phpuser phpapp
cpanel db:create phpapp
cpanel db:user-create phpuser '<强密码>'
cpanel db:grant phpuser phpapp
3. deploy mã nguồn (KHÔNG kèm file secret)
3. 部署源代码(不包含机密文件)
cpanel deploy:static ./myphpapp public_html/php
cpanel deploy:static ./myphpapp public_html/php
4. ghi file config chứa credential TRỰC TIẾP trên server (không nằm trong zip)
4. 在服务器上直接写入包含凭证的配置文件(不在zip包中)
cpanel file:save public_html/php config.php ./local-config.php
Trong config dùng **tên DB/user đầy đủ có tiền tố** (`<user>_phpapp`), host `localhost`.cpanel file:save public_html/php config.php ./local-config.php
配置文件中需使用**带前缀的完整数据库/用户名**(`<user>_phpapp`),主机为`localhost`。Deploy Laravel KHÔNG cần SSH (đã kiểm chứng end-to-end)
无需SSH部署Laravel(已端到端验证)
Vì không có SSH (không chạy được / trên server), công thức là build
local rồi bundle:
composerartisanbash
undefined由于没有SSH(无法在服务器上运行/),解决方案是本地构建后打包:
composerartisanbash
undefined=== LÀM LOCAL ===
=== 本地操作 ===
1. Tạo app + build vendor khớp PHP server (vd server PHP 8.3 → platform 8.3)
1. 创建应用并构建与服务器PHP版本匹配的vendor目录(例如服务器PHP 8.3 → 指定platform 8.3)
composer create-project laravel/laravel myapp # dùng bản Laravel còn được hỗ trợ
cd myapp
composer config platform.php 8.3.0
composer update --no-dev --optimize-autoloader # vendor gọn, đúng PHP target
composer create-project laravel/laravel myapp # 使用仍受支持的Laravel版本
cd myapp
composer config platform.php 8.3.0
composer update --no-dev --optimize-autoloader # 精简vendor目录,匹配目标PHP版本
2. DÙNG SQLITE: pre-migrate LOCAL (khỏi chạy artisan migrate trên server)
2. 使用SQLITE:本地预迁移(无需在服务器上运行artisan migrate)
touch database/database.sqlite
php artisan migrate --force
php artisan optimize:clear # tránh cache path local
cd ..
touch database/database.sqlite
php artisan migrate --force
php artisan optimize:clear # 清除本地路径缓存
cd ..
=== DEPLOY (1 lệnh) ===
=== 部署(一键命令) ===
cpanel deploy:laravel ./myapp public_html/myapp https://app.example.com
`deploy:laravel` tự: sinh `APP_KEY`, loại `.env` local khỏi zip, upload + giải nén,
ghi `.env` server (mặc định SQLite, file session/cache). Sau đó **2 bước thủ công**:
```bashcpanel deploy:laravel ./myapp public_html/myapp https://app.example.com
`deploy:laravel`会自动生成`APP_KEY`,从zip包中移除本地`.env`文件,上传+解压,写入服务器端`.env`文件(默认使用SQLite,文件存储session/缓存)。之后需要**两步手动操作**:
```bashTrỏ document root vào public/ + đặt PHP version cho vhost
将文档根目录指向public/并为虚拟主机设置PHP版本
cpanel subdomain:add app example.com public_html/myapp/public
cpanel uapi LangPHP php_set_vhost_versions vhost=app.example.com version=alt-php83
**Điểm mấu chốt đã kiểm chứng:**
- Laravel 13 cần PHP ≥ 8.3 — `composer config platform.php` phải khớp PHP server, và
vhost phải đặt đúng version. Tránh bản Laravel EOL (vd 10.x) vì composer 2.9 chặn do
security advisory.
- **DB**: SQLite pre-migrated local là cách sạch nhất (không cần migrate trên server,
không cần MySQL). File `database/database.sqlite` ghi được vì PHP chạy bằng quyền user.
Nếu cần MySQL: tạo DB (`db:*`) + sửa `.env` (`file:save`) + chạy migrate qua cron one-shot.
- **MIME/PHP version khi verify qua userdir:** xem mục dưới — path từng-là-subdomain-docroot
bị áp PHP account-default (vd 7.4), không phải PHP của subdomain.cpanel subdomain:add app example.com public_html/myapp/public
cpanel uapi LangPHP php_set_vhost_versions vhost=app.example.com version=alt-php83
**已验证的关键点:**
- Laravel 13需要PHP ≥ 8.3 — `composer config platform.php`必须与服务器PHP版本匹配,且虚拟主机需设置正确版本。避免使用已终止支持的Laravel版本(如10.x),因为composer 2.9会因安全提醒拦截安装。
- **数据库**:本地预迁移SQLite是最简洁的方式(无需在服务器上执行迁移,无需MySQL)。`database/database.sqlite`文件可被PHP以用户权限写入。如果需要MySQL:创建数据库(`db:*`命令)+ 修改`.env`(`file:save`命令)+ 通过一次性定时任务执行迁移。
- **验证用户目录时的MIME/PHP版本**:见下文——作为子域文档根目录的路径在通过用户目录访问时会应用**账户默认PHP版本**(如7.4),而非为子域设置的PHP版本。Clone Git repo về hosting (đã kiểm chứng)
克隆Git仓库到主机(已验证)
bash
undefinedbash
undefinedpath tương đối tự resolve thành tuyệt đối; tên repo tự suy từ basename
相对路径会自动解析为绝对路径;仓库名称自动从basename推断
cpanel git:clone https://github.com/user/repo.git myrepo
cpanel git:list # xem repo + available_branches
Thư mục đích phải **CHƯA tồn tại**. Clone là async — đợi vài giây rồi `file:read`/
`list_files` để xác minh. Repo private cần URL có token.cpanel git:clone https://github.com/user/repo.git myrepo
cpanel git:list # 查看仓库及可用分支
目标文件夹必须**不存在**。克隆为异步操作——等待几秒后使用`file:read`/`list_files`验证。私有仓库需使用包含令牌的URL。Deploy Node.js app (Passenger — đã kiểm chứng đăng ký)
部署Node.js应用(Passenger — 已验证注册)
bash
undefinedbash
undefined1. subdomain làm Application URL
1. 创建子域名作为应用URL
cpanel subdomain:add node thachtestvibe.dev
cpanel subdomain:add node thachtestvibe.dev
2. đưa code vào app root (KHÁC docroot web; vd thư mục 'nodeapp')
2. 将代码放入应用根目录(与Web文档根目录不同;例如nodeapp
文件夹)
nodeappcpanel deploy:static ./nodeapp nodeapp
cpanel deploy:static ./nodeapp nodeapp
3. đăng ký app (app_root, domain, app_name)
3. 注册应用(app_root, domain, app_name)
cpanel node:create nodeapp node.thachtestvibe.dev mynode app.js production
cpanel node:list
> **Giới hạn không-SSH:** Passenger không chạy `npm install` qua API. Hoặc dùng app
> **zero-dependency** (chỉ module built-in của Node), hoặc bundle sẵn `node_modules`
> vào zip. App nghe qua `http.createServer().listen(process.env.PORT||3000)` —
> Passenger tự hijack. Mỗi domain chỉ gắn được **một** app.cpanel node:create nodeapp node.thachtestvibe.dev mynode app.js production
cpanel node:list
> **无SSH限制**:无法通过API让Passenger执行`npm install`。要么使用**零依赖**应用(仅使用Node内置模块),要么将`node_modules`打包到zip包中。应用需通过`http.createServer().listen(process.env.PORT||3000)`监听——Passenger会自动接管端口。每个域名只能绑定**一个**应用。Deploy thủ công một ứng dụng bất kỳ (file ops thô)
手动部署任意应用(原始文件操作)
bash
cpanel file:upload ./myapp.zip public_html
cpanel file:extract public_html/myapp.zip public_html
cpanel file:save public_html .env ./local.envbash
cpanel file:upload ./myapp.zip public_html
cpanel file:extract public_html/myapp.zip public_html
cpanel file:save public_html .env ./local.envKiểm chứng sau deploy
部署后验证
bash
undefinedbash
undefined1. File đã vào đúng chỗ
1. 确认文件已上传到正确位置
cpanel uapi Fileman list_files dir=public_html | jq -r '.data[].file'
cpanel uapi Fileman list_files dir=public_html | jq -r '.data[].file'
2. wp-config.php đúng credential
2. 确认wp-config.php的凭证正确
cpanel file:read public_html wp-config.php | jq -r .data.content
cpanel file:read public_html wp-config.php | jq -r .data.content
3. Database tồn tại
3. 确认数据库存在
cpanel db:list
**Xem website khi domain CHƯA trỏ DNS:** dùng URL mod_userdir của server:
`https://<server-host>/~<cpaneluser>/` (phục vụ `public_html`) hoặc
`https://<server-host>/~<cpaneluser>/<subdir>/` cho thư mục con. Đây là cách kiểm
chứng file tĩnh + PHP khi domain chưa trỏ. Lưu ý:
- File tĩnh & PHP trong `public_html/*` xem được qua userdir.
- **Node.js/Passenger và vhost subdomain KHÔNG chạy qua userdir** — cần DNS trỏ thật
để hit đúng vhost. Khi chưa có DNS, chỉ xác minh được tới mức API trả `enabled=1`.
- Truy cập thẳng `https://<domain>/` rơi vào vhost mặc định cho tới khi DNS đúng.
- **PHP version qua userdir (CloudLinux):** thư mục là/từng-là **docroot của subdomain**
bị áp PHP **account-default** (thường 7.4) khi truy cập qua userdir, KHÔNG theo version
đã đặt cho subdomain. Để verify app cần PHP mới (vd Laravel/8.3) khi chưa có DNS: deploy
vào **subdir thường dưới `public_html`** (chưa từng là subdomain docroot) để kế thừa PHP
của domain chính, và đặt domain chính sang version cần thiết (`php_set_vhost_versions`).
Production thật: dùng DNS + subdomain docroot→public + set PHP cho chính vhost subdomain.cpanel db:list
**域名未指向DNS时访问网站**:使用服务器的mod_userdir URL:`https://<server-host>/~<cpaneluser>/`(对应`public_html`)或`https://<server-host>/~<cpaneluser>/<subdir>/`对应子文件夹。这是域名未指向时验证静态文件+PHP的方法。注意:
- `public_html/*`下的静态文件和PHP可通过用户目录访问。
- **Node.js/Passenger和子域虚拟主机无法通过用户目录运行**——需要真实DNS指向才能命中正确虚拟主机。未设置DNS时,只能验证到API返回`enabled=1`的程度。
- 直接访问`https://<domain>/`会进入默认虚拟主机,直到DNS设置正确。
- **通过用户目录访问时的PHP版本(CloudLinux)**:作为**子域文档根目录**的文件夹在通过用户目录访问时会应用**账户默认PHP版本**(通常为7.4),而非为子域设置的版本。若要在未设置DNS时验证需要新版本PHP的应用(如Laravel/8.3):将应用部署到`public_html`下的**普通子文件夹**(从未作为子域文档根目录)以继承主域名的PHP版本,并将主域名设置为所需版本(`php_set_vhost_versions`)。生产环境:使用DNS + 子域文档根目录指向public + 为子域虚拟主机设置PHP版本。Bài học thực chiến (đã kiểm chứng trên server thật)
实战经验(已在真实服务器上验证)
- path semantics:
fileoptính tương đối thư mục chứa nguồn, KHÔNG phải home. Khi extract, dùngdestfiles(giải nén tại thư mục chứa archive). Khi move, dùng đường dẫn tuyệt đối (lấy từ trườngdestfiles="."củafullpath).list_files - che
index.html: Apache/LiteSpeed ưu tiênindex.php.index.htmltự đổi tên nó thànhdeploy:wp; nếu deploy thủ công, nhớ làm bước này.index.html.default-bak - Tiền tố MySQL: tự ghép tiền tố cho DB/user (xem
deploy:wp).cpanel-database - Git clone ():
VersionControl::createphải tuyệt đối;repository_rootlà JSON objectsource_repository(không phải string); cần{"url":"..."}; thư mục đích phải chưa tồn tại.namelo hết các điểm này.git:clone - Node.js (): hàm đúng là
PassengerApps, tham sốregister_application(số ít). Khôngdomainđược qua API → app zero-dep hoặc bundlenpm install.node_modules
- 路径语义:
fileop是相对于源文件所在目录的路径,而非主目录。解压时使用destfiles(在归档文件所在目录解压)。移动时使用绝对路径(从destfiles="."的list_files字段获取)。fullpath - 覆盖
index.html:Apache/LiteSpeed优先加载index.php。index.html会自动将其重命名为deploy:wp;若手动部署,需记得执行此步骤。index.html.default-bak - MySQL前缀:会自动为数据库/用户添加前缀(查看
deploy:wp)。cpanel-database - Git克隆():
VersionControl::create必须为绝对路径;repository_root是JSON对象source_repository(而非字符串);需要指定{"url":"..."};目标文件夹必须不存在。name命令会处理所有这些细节。git:clone - Node.js():正确的函数是
PassengerApps,参数为register_application(单数)。无法通过API执行domain→ 使用零依赖应用或打包npm install。node_modules
An toàn & lưu ý
安全与注意事项
- Deploy vào sẽ ghi đè trang mặc định. Nếu docroot đã có site, xác nhận với người dùng trước; cân nhắc deploy vào thư mục con + subdomain.
public_html - Mật khẩu DB đặt trong nháy đơn để shell không diễn giải ký tự đặc biệt; mật khẩu yếu có thể bị cPanel từ chối.
- không tạo admin WordPress — bước đó do người dùng làm qua trình duyệt (an toàn hơn việc hard-code mật khẩu admin).
deploy:wp - Liên kết: (DB),
cpanel-database(subdomain cho site mới),cpanel-domain(đọc error_log nếu deploy lỗi).cpanel-debug
- 部署到会覆盖默认页面。如果文档根目录已有站点,需先与用户确认;考虑部署到子文件夹+子域名。
public_html - 数据库密码使用单引号包裹,避免shell解析特殊字符;弱密码可能被cPanel拒绝。
- 不会创建WordPress管理员账户——该步骤由用户通过浏览器完成(比硬编码管理员密码更安全)。
deploy:wp - 相关链接:(数据库操作)、
cpanel-database(为新站点创建子域名)、cpanel-domain(部署出错时读取error_log)。",cpanel-debug