Forge是服务器自动化配置与部署触发器的组合体,它通过Ansible风格脚本自动创建云服务器、配置PHP/MySQL/Nginx等环境,并在代码推送后按自定义脚本执行部署流程,但不直接运行composer或artisan命令。
Forge 不是部署工具,而是服务器自动化配置 + 部署触发器的组合体。它本身不执行
或
,而是帮你把执行这些命令的环境和流程「稳稳地搭好」——一旦你推送代码,它就按你定义的脚本自动跑完整套流程。
创建服务器时 Forge 实际干了什么
你点下“Create Server”后,Forge 并不是简单起个云主机,而是通过 Ansible 风格脚本远程执行一整套初始化:
在 DigitalOcean/Linode 等平台调用 API 创建 Ubuntu 22.04/24.04 实例
禁用 root 密码登录,只保留 SSH 密钥认证
安装并配置
、
、
、
、
设置 UFW 防火墙,默认只开放 22、80、443 端口
创建非 root 部署用户(如
),并赋予
权限用于后续部署脚本
这意味着你根本不需要手动连服务器敲
—— 但也要注意:Forge 不装 Node.js、不配 Docker、不处理自定义内核模块。超出 PHP+Web+DB 栈的部分,得自己写「启动后脚本」补上。
部署流程中哪些步骤可被覆盖或跳过
Forge 默认部署脚本(Deploy Script)是可编辑的文本框,内容类似:
关键点:
Laravel 13.2.0
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
下载
是 Forge 自动注入的路径(如
),别硬写
,否则可能调到系统默认旧版本
前不会自动
,如果你用
分支,就得把那行改成
加了
才能在生产环境跑,漏掉会静默失败
前端构建(如
)默认不包含,必须手动加在
后面,并确保已装 Node.js
Supervisor 管理的队列监听器不会自动重启 —— 要加
这类行
SSL 证书自动续期为什么有时失效
Forge 用 Let’s Encrypt 的
配置定时任务(
可查),但常见失效原因不是证书过期,而是验证环节卡住:
域名 DNS 解析未指向该服务器 IP(尤其刚换服务器时,TTL 未过期)
Nginx 配置里漏了
块,导致 certbot HTTP 验证 404
站点启用了 Cloudflare 代理,且没关「Always Use HTTPS」或没设「Full (strict)」SSL 模式,导致验证请求被拦截
防火墙(UFW)误封了 80 端口 —— Forge 虽然开了,但你后来手动改过规则可能覆盖掉
检查方式很简单:SSH 登录后运行
,看输出里是否出现
或
。
Forge CLI 和 SDK 的权限边界在哪
Forge CLI(
)和 SDK(
)都依赖同一个 API Token,但能操作的资源受 Forge 后台权限控制:
Token 在 Forge 控制台生成时,可限定「仅读」或「读写」;选错就无法调用
或
CLI 默认操作的是「当前激活服务器」(
查),切换需
,不是所有服务器都自动可见
SDK 中
只能管理该 Token 所属团队下的站点,跨团队不行;也不能直接读取
内容或下载日志文件
所有 CLI/SDK 操作都会在 Forge 控制台的「Activity Log」里留痕,但不会记录脚本执行的具体 stdout —— 错误还得看部署日志页里的实时输出
真正容易被忽略的是:Forge 的「部署脚本」运行在
用户下,而 CLI/SDK 发起的操作(如
)走的是 Supervisor 的 socket 接口,两者权限模型不同,不能假设「脚本能做的事,CLI 一定也能做」。
composer installphp artisan migratenginxphp8.2-fpmmysql-serverredis-serversupervisorforgesudo NOPASSWDapt updatecd /home/forge/example.com
git pull origin main
$PHP_BINARY composer install --no-dev --quiet --optimize-autoloader
$PHP_BINARY artisan migrate --force --quiet
$PHP_BINARY artisan config:cache
$PHP_BINARY artisan route:cache
$PHP_BINARY artisan view:cache
sudo systemctl reload nginx$PHP_BINARY/usr/bin/php8.2phpgit pullgit checkoutproductiongit checkout production && git pull origin productionartisan migrate--forcenpm run buildcomposer installsudo supervisorctl restart example-worker:certbotcrontab -u root -llocation ^~ /.well-known/acme-challenge/sudo certbot renew --dry-runfailed validationconnection refusedforge deployForge::createServer()deployrestart queueforge server:currentforge server:switch stagingManagesSites.php.envforgequeue:restart