Forge本质是服务器初始化与部署触发系统,不自动执行composer/artisan命令;创建服务器时自动锁定Ubuntu版本、禁用root密码登录、配置Nginx/PHP/MySQL/Redis/UFW、创建forge用户并赋sudo权限。

Forge 不是“点一下就部署好”的黑盒工具,它本质是一套可配置的服务器初始化 + 部署流程触发系统。你必须明确:它不替你写部署脚本,只确保这些脚本能在干净、一致、安全的环境中稳定执行。
创建服务器时 Forge 实际执行了哪些关键操作
你点下 Create Server 后,Forge 并非仅调用云厂商 API 起一台机器,而是立即在新实例上远程运行 Ansible 风格初始化脚本,完成以下不可跳过的硬性配置:
- 操作系统锁定为 Ubuntu 22.04 或 24.04(不支持 CentOS/AlmaLinux,也不装 Node.js 或 Docker)
- 禁用
root密码登录,强制使用 SSH 密钥认证;同时创建forge用户并赋予sudo NOPASSWD权限——这是后续所有部署脚本能免密执行composer、php artisan的前提 - 安装并预配
nginx(含默认站点模板)、php8.2-fpm(含常用扩展如mbstring、xml、pdo_mysql)、mysql-server、redis-server、supervisor - 启用
ufw防火墙,仅开放22、80、443端口;不开放3306(MySQL)或6379(Redis)外网端口
添加站点后 Forge 如何接管部署流程
站点不是简单地把代码 clone 到 /home/forge/example.com 就完事。Forge 会为你生成 Nginx 配置、设置 Web 根目录权限、绑定域名,并在你点击「Deploy」或推送 Git 后,严格按你填写的「Deployment Script」字段内容逐行执行——它不做任何隐式判断。
- 默认脚本包含
git pull、composer install --no-interaction --prefer-dist --optimize-autoloader、npm ci && npm run build(如果检测到package.json)、php artisan migrate --force、php artisan config:clear等,但这些都只是模板,你删掉某一行,它就不会执行 - 环境变量由 Forge 单独管理(在站点设置页填
APP_ENV、DB_PASSWORD等),它们被写入.env文件前会自动转义换行和引号,避免因手动编辑出错导致php artisan报错 - SSL 证书通过 Let’s Encrypt 自动申请并续期,但前提是域名已正确解析到服务器 IP,且 Nginx 配置中未被自定义重写规则干扰(比如误加了
return 301 https://...在非 443 server 块里)
常见部署失败的三个典型原因
绝大多数 “点了 Deploy 没反应” 或 “页面 500” 问题,都卡在这三处,而不是 Forge 本身故障:
-
Deployment Script中用了php artisan migrate但没加--force:生产环境默认禁止交互式迁移,不加该参数会卡住并超时 - 数据库连接失败却没暴露错误:Forge 默认关闭 PHP 错误显示,
DB_HOST写成localhost(而 MySQL 绑定的是127.0.0.1)或密码含特殊字符未被正确转义,都会让artisan静默失败 - Supervisor 配置未生效:你在 Forge 页面勾选了「Queue Worker」,但它生成的
/etc/supervisor/conf.d/your-app.conf不会自动 reload;必须手动在服务器上运行sudo supervisorctl reread && sudo supervisorctl update,或等 Forge 下次部署时自动触发(取决于你是否勾选「Restart queue workers」)
Forge 的确定性来自它的克制:它不猜你要做什么,只忠实地执行你写的每一条命令、填的每一个变量、勾的每一个开关。真正容易被忽略的,是你以为它“应该自动处理”的地方——比如队列进程重启、缓存预热时机、或 storage:link 是否需要在每次部署后运行。这些必须显式写进部署脚本,没有例外。


















