Laravel Forge:服务器配置与自动部署
High Contrast
Dark Mode
Light Mode
Sepia
Forest
1 min read180 words

Laravel Forge:服务器配置与自动部署

Laravel Forge 是官方的服务器管理平台——连接云服务商(AWS/DigitalOcean/Vultr),自动完成 Nginx、PHP-FPM、MySQL、Redis、队列、SSL 的全套配置,5 分钟内让 TaskFlow 跑在生产服务器上。


Forge 工作原理

你的代码(GitHub)
↓ 推送到 main 分支
Forge(监听 webhook)
↓ SSH 登录服务器
服务器执行部署脚本
↓ git pull + composer + migrate + optimize
TaskFlow 上线 ✅

服务器配置(Forge 控制台操作)

# Forge 会自动安装并配置:
# - Ubuntu 22.04 LTS
# - Nginx(反向代理到 PHP-FPM)
# - PHP 8.3 + PHP-FPM
# - MySQL 8.0 / PostgreSQL 16
# - Redis 7
# - Supervisor(队列 Worker 进程管理)
# - Let's Encrypt SSL(免费证书,自动续期)
# - UFW 防火墙(只开放 80/443/22)
# 推荐服务器规格(TaskFlow 起步):
# 2 vCPU / 4GB RAM / 80GB SSD
# DigitalOcean: $24/月
# AWS EC2: t3.medium ~$30/月

自定义部署脚本

# Forge → Sites → taskflow.app → Deployments → Deploy Script
# 每次推送到 main 分支时执行:
cd /home/forge/taskflow.app
# 拉取最新代码
git pull origin $FORGE_SITE_BRANCH
# 安装依赖(跳过 dev 包,优化自动加载)
$FORGE_COMPOSER install --no-dev --optimize-autoloader
# 清除旧缓存
$FORGE_PHP artisan optimize:clear
# 执行数据库迁移
$FORGE_PHP artisan migrate --force
# 生成框架级缓存(路由、配置、视图)
$FORGE_PHP artisan optimize
# 重启队列 Worker(让新代码生效)
$FORGE_PHP artisan queue:restart
# 如果用了 Reverb WebSocket
$FORGE_PHP artisan reverb:restart 2>/dev/null || true
# 通知 Forge 部署成功
( flock -w 10 9 || exit 1
echo 'Restarting FPM...'; sudo -S service $FORGE_PHP_FPM restart > /dev/null 2>&1
) 9>/tmp/fpmlock

Forge 环境变量管理

# Forge → Sites → Environment → Edit
# 直接在 Forge 界面管理 .env(不需要 SSH)
APP_NAME="TaskFlow"
APP_ENV=production
APP_KEY=base64:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
APP_DEBUG=false
APP_URL=https://taskflow.app
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=taskflow
DB_USERNAME=taskflow
DB_PASSWORD=StrongPassword123!
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
QUEUE_CONNECTION=redis
CACHE_STORE=redis
SESSION_DRIVER=redis
MAIL_MAILER=smtp
MAIL_HOST=smtp.postmarkapp.com
MAIL_PORT=587
MAIL_USERNAME=your-postmark-api-token
MAIL_PASSWORD=your-postmark-api-token
MAIL_FROM_ADDRESS=noreply@taskflow.app
MAIL_FROM_NAME=TaskFlow
AWS_ACCESS_KEY_ID=xxx
AWS_SECRET_ACCESS_KEY=xxx
AWS_DEFAULT_REGION=ap-southeast-1
AWS_BUCKET=taskflow-uploads
FILESYSTEM_DISK=s3
SENTRY_LARAVEL_DSN=https://xxx@sentry.io/xxx

Nginx 配置(Forge 自动生成,可自定义)

# /etc/nginx/sites-available/taskflow.app
server {
listen 80;
listen [::]:80;
server_name taskflow.app www.taskflow.app;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name taskflow.app www.taskflow.app;
root /home/forge/taskflow.app/public;
index index.php;
# SSL(Let's Encrypt,Forge 自动申请和续期)
ssl_certificate /etc/nginx/ssl/taskflow.app/server.crt;
ssl_certificate_key /etc/nginx/ssl/taskflow.app/server.key;
# 文件上传大小限制
client_max_body_size 20M;
# API 速率限制(Nginx 层)
limit_req_zone $binary_remote_addr zone=api:10m rate=60r/m;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location /api/ {
limit_req zone=api burst=20 nodelay;
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
# WebSocket(Reverb)
location /app/ {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
# 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js|webp|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}

Forge Daemon:队列 Worker 进程

# Forge → Sites → Daemons → New Daemon
# Forge 用 Supervisor 管理这些后台进程
# 配置 1:默认队列
Command: php /home/forge/taskflow.app/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600
User: forge
Directory: /home/forge/taskflow.app
Processes: 3
# 配置 2:高优先级队列(邮件、通知)
Command: php /home/forge/taskflow.app/artisan queue:work redis --queue=notifications,mail,default --sleep=3 --tries=3
User: forge
Directory: /home/forge/taskflow.app
Processes: 2
# 配置 3:Reverb WebSocket(如果用了广播)
Command: php /home/forge/taskflow.app/artisan reverb:start --host=0.0.0.0 --port=8080
User: forge
Directory: /home/forge/taskflow.app
Processes: 1

部署通知与 Slack 集成

// Forge 部署失败时通知
// Forge → Servers → Notifications → Add Slack Webhook
// 也可以在部署脚本末尾手动发通知:
// deploy.sh 末尾添加:
if [ $? -eq 0 ]; then
curl -s -X POST "$SLACK_WEBHOOK_URL" \
-H 'Content-type: application/json' \
--data "{\"text\":\"✅ TaskFlow 部署成功 ($(git rev-parse --short HEAD))\"}"
else
curl -s -X POST "$SLACK_WEBHOOK_URL" \
-H 'Content-type: application/json' \
--data "{\"text\":\"❌ TaskFlow 部署失败!请立即检查。\"}"
fi

下一节Docker 容器化部署——Forge 适合快速部署到单台服务器。如果需要容器化、K8s 或者统一的开发/生产环境,Docker 是更好的选择。