laravel/forge-cli
Command-line interface for Laravel Forge to provision and manage servers, deploy sites, and handle common tasks like SSL certificates, scheduled jobs, and queue workers—bringing Forge’s dashboard capabilities to your terminal.
Installation:
composer global require laravel/forge-cli
Ensure ~/.composer/vendor/bin is in your PATH.
Authentication:
forge-cli auth login
Follow prompts to authenticate via Forge API token (stored securely in ~/.forge-cli).
First Use Case: List available servers:
forge-cli server:list
Deploy a Laravel app:
forge-cli site:deploy <site-id>
forge-cli ssh:configure
(Auto-generates SSH keys and configures remote access.)forge-cli server:create --name "prod-server" --server-type "digital_ocean" --plan "basic"
forge-cli server:reboot <server-id>
forge-cli server:tag <server-id> "env:production"
forge-cli site:deploy <site-id> --branch "main"
forge-cli site:rollback <site-id>
forge-cli env:pull <site-id> .env # Pull remote .env to local
forge-cli env:push <site-id> .env # Push local .env to server
- name: Deploy to Forge
run: |
forge-cli site:deploy ${{ secrets.FORGE_SITE_ID }} --branch ${{ github.ref_name }}
env:
FORGE_API_TOKEN: ${{ secrets.FORGE_API_TOKEN }}
env:push to sync secrets post-deployment (avoid hardcoding in repo).forge-cli site:logs <site-id> --follow
forge-cli daemon:logs <site-id> --daemon "queue:worker"
forge-cli database:shell <site-id>
forge-cli ssh <server-id> "php artisan queue:work --once"
forge-cli open <server-id>
Laravel Artisan Hooks:
Extend app/Console/Kernel.php to trigger Forge deployments post-migration:
protected function commands()
{
$this->call('forge:deploy', [
'--site-id' => env('FORGE_SITE_ID'),
'--branch' => 'main',
]);
}
(Requires custom forge:deploy command using the CLI under the hood.)
Local Development Sync:
Use env:pull in a post-clone Git hook to sync .env files:
forge-cli env:pull <site-id> .env.production
Multi-Environment Workflows:
Tag servers/sites by environment (e.g., env:staging) and filter CLI commands:
forge-cli site:list --tag "env:staging"
Authentication Issues:
401 Unauthorized errors.FORGE_API_TOKEN is set (check ~/.forge-cli/config.json).FORGE_API_TOKEN env var (not interactive login).SSH Configuration:
Permission denied (publickey).forge-cli ssh:configure to regenerate keys.
Verify ~/.ssh/config includes Forge’s SSH settings.Deployment Failures:
--verbose flag:
forge-cli site:deploy <site-id> --verbose
Check server logs:
forge-cli site:logs <site-id> --follow
Environment Variable Conflicts:
.env files not updating.env:push targets the correct path (e.g., /home/forge/app/.env).
Use --force to overwrite:
forge-cli env:push <site-id> .env --force
Non-Interactive Mode:
--no-interaction flag:
forge-cli site:deploy <site-id> --no-interaction
Pre-configure answers in ~/.forge-cli/config.json:
{
"deploy_branch": "main",
"deploy_message": "CI Deployment"
}
Check CLI Version:
forge-cli --version
Update if outdated (CLI warns users automatically).
Inspect API Calls: Enable debug mode:
forge-cli --debug server:list
(Logs raw API responses to ~/.forge-cli/forge-cli.log.)
SSH Debugging:
Use -vvv for verbose SSH output:
forge-cli ssh <server-id> "command" -vvv
Custom Commands:
Extend the CLI by creating a Laravel Zero command that wraps forge-cli:
// app/Console/Commands/DeployToForge.php
public function handle()
{
$output = $this->callSilently('forge:deploy', [
'--site-id' => $this->argument('site-id'),
'--branch' => $this->option('branch'),
]);
$this->info($output);
}
Provider-Specific Logic:
Override default provider behavior by extending the CLI’s ServerProvider class (advanced).
Webhook Triggers: Use Forge’s webhooks to trigger CLI commands via HTTP endpoints (e.g., deploy on Git push).
Custom SSH Ports:
Configure in ~/.forge-cli/config.json:
{
"ssh_port": 2222
}
(Affects all ssh commands.)
Rate Limits: Forge API has rate limits (~60 requests/minute). Batch commands or add retries:
forge-cli --retry 3 server:list
PHP Version Pinning: Ensure your local PHP version matches the server’s (CLI uses server’s PHP for deployments). Check with:
forge-cli server:show <server-id> --php
How can I help you explore Laravel packages today?