Deploy em Produção
Guia completo para fazer deploy do Filament Core Starter Kit em ambiente de produção.
Checklist Pré-Deploy
Antes de fazer deploy, certifique-se de:
- [ ] Todos os testes estão passando
- [ ]
.env.exampleestá atualizado com todas as variáveis - [ ] Secrets estão configurados no ambiente de produção
- [ ] Backup do banco de dados foi criado (se migração)
- [ ] SSL/TLS está configurado
- [ ] DNS está apontando para o servidor
- [ ] Monitoring está configurado
Preparação do Código
1. Otimizar Dependências
bash
# Remover dependências de desenvolvimento
composer install --optimize-autoloader --no-dev
# Otimizar autoload
composer dump-autoload --optimize --classmap-authoritative2. Compilar Assets
bash
# Produção com otimizações
npm run build
# Verificar tamanho dos bundles
du -sh public/build/*3. Cachear Configurações
bash
# Cachear configs
php artisan config:cache
# Cachear rotas
php artisan route:cache
# Cachear views
php artisan view:cache
# Cachear events
php artisan event:cache
# Cachear icons do Filament
php artisan filament:cache-components4. Executar Migrações
bash
# Verificar status antes
php artisan migrate:status
# Executar em produção
php artisan migrate --force
# Reverter se necessário (CUIDADO!)
php artisan migrate:rollback --step=1Configuração .env para Produção
bash
# Aplicação
APP_NAME="Minha Aplicação"
APP_ENV=production
APP_DEBUG=false
APP_URL=https://seudominio.com
# Segurança
APP_KEY=base64:... # NUNCA commitar isso no Git!
# Banco de Dados
DB_CONNECTION=mysql
DB_HOST=seu-db-host.com
DB_PORT=3306
DB_DATABASE=producao_db
DB_USERNAME=usuario_producao
DB_PASSWORD=senha_forte_aqui
# Cache e Sessões (Redis recomendado)
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis
REDIS_HOST=seu-redis-host.com
REDIS_PASSWORD=senha_redis
REDIS_PORT=6379
# Email
MAIL_MAILER=ses
AWS_ACCESS_KEY_ID=sua_key
AWS_SECRET_ACCESS_KEY=sua_secret
AWS_DEFAULT_REGION=us-east-1
AWS_SES_REGION=us-east-1
MAIL_FROM_ADDRESS=noreply@seudominio.com
# Logs
LOG_CHANNEL=daily
LOG_LEVEL=error
LOG_DEPRECATIONS_CHANNEL=null
# Queue
QUEUE_CONNECTION=redis
# Storage (S3 recomendado)
FILESYSTEM_DISK=s3
AWS_BUCKET=seu-bucket
# Segurança
SESSION_SECURE_COOKIE=true
SESSION_SAME_SITE=strictDeploy em Diferentes Plataformas
Laravel Forge (Recomendado)
1. Criar Servidor
- Acesse Laravel Forge
- Create Server → Escolha provider (DigitalOcean, AWS, etc)
- Selecione tamanho: Mínimo 2GB RAM
- Escolha região próxima aos usuários
- Aguarde provisionamento (5-10 min)
2. Criar Site
bash
# No Forge:
# Sites → New Site
# Domain: seudominio.com
# Project Type: General PHP/Laravel
# Web Directory: /public3. Configurar Repositório
bash
# No Forge:
# Site → Git Repository
# Provider: GitHub
# Repository: usuario/repositorio
# Branch: main
# Deploy Key: Copiar e adicionar no GitHub4. Script de Deploy
bash
# No Forge → Site → Deployment Script
cd /home/forge/seudominio.com
# Ativar modo manutenção
php artisan down
# Atualizar código
git pull origin main
# Instalar dependências
composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader
# Executar migrações
php artisan migrate --force
# Limpar e cachear
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache
# Recompilar assets se necessário
# npm ci
# npm run build
# Reiniciar queue workers
php artisan queue:restart
# Reativar aplicação
php artisan up
# Limpar cache de aplicação
php artisan cache:clear5. Configurar Workers de Fila
bash
# No Forge → Site → Queue
# Connection: redis
# Max Processes: 1
# Tries: 3
# Sleep: 36. Agendar Tarefas
bash
# No Forge → Site → Scheduler
# Já configurado automaticamente para:
# * * * * * php artisan schedule:run7. SSL Gratuito
bash
# No Forge → Site → SSL
# LetsEncrypt: Ativar
# Domain: seudominio.com
# Force HTTPS: SimLaravel Vapor (Serverless)
1. Instalar Vapor CLI
bash
composer require laravel/vapor-cli --dev
php artisan vapor:install2. Configurar vapor.yml
yaml
id: 12345
name: filament-core-starter-kit
environments:
production:
domain: seudominio.com
memory: 1024
cli-memory: 512
runtime: 'php-8.3:al2'
build:
- 'COMPOSER_MIRROR_PATH_REPOS=1 composer install --no-dev --classmap-authoritative'
- 'npm ci && npm run build'
deploy:
- 'php artisan migrate --force'
- 'php artisan config:cache'
- 'php artisan event:cache'
- 'php artisan route:cache'
- 'php artisan view:cache'
cache: filament-core-cache
database: filament-core-db
storage: filament-core-storage
queues:
- default3. Deploy
bash
# Deploy para produção
vapor deploy production
# Ver logs
vapor logs productionDigitalOcean App Platform
1. Criar App
bash
# Via dashboard:
# Create → Apps → Deploy from GitHub
# Selecione repositório2. Configurar deploy.template.yaml
yaml
name: filament-core-starter-kit
services:
- name: web
github:
repo: usuario/repositorio
branch: main
deploy_on_push: true
build_command: |
composer install --optimize-autoloader --no-dev
npm ci
npm run build
run_command: |
php artisan config:cache
php artisan migrate --force
heroku-php-apache2 public/
envs:
- key: APP_KEY
scope: RUN_TIME
value: ${APP_KEY}
- key: APP_ENV
value: production
- key: APP_DEBUG
value: "false"
http_port: 8080
databases:
- name: db
engine: MYSQL
version: "8"
- name: redis
engine: REDIS
version: "7"VPS Manual (Ubuntu 22.04)
1. Instalar Dependências
bash
# Atualizar sistema
sudo apt update && sudo apt upgrade -y
# Instalar PHP 8.3
sudo add-apt-repository ppa:ondrej/php
sudo apt install -y php8.3 php8.3-fpm php8.3-mysql php8.3-xml \
php8.3-mbstring php8.3-curl php8.3-zip php8.3-gd php8.3-redis
# Instalar Composer
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
# Instalar Node.js 20
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
# Instalar Nginx
sudo apt install -y nginx
# Instalar MySQL
sudo apt install -y mysql-server
sudo mysql_secure_installation
# Instalar Redis
sudo apt install -y redis-server
sudo systemctl enable redis-server2. Configurar Nginx
nginx
# /etc/nginx/sites-available/seudominio.com
server {
listen 80;
listen [::]:80;
server_name seudominio.com www.seudominio.com;
root /var/www/seudominio.com/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}bash
# Ativar site
sudo ln -s /etc/nginx/sites-available/seudominio.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx3. Instalar SSL com Certbot
bash
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d seudominio.com -d www.seudominio.com4. Configurar Supervisor para Queue
ini
# /etc/supervisor/conf.d/laravel-worker.conf
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/seudominio.com/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasflags=TERM
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/seudominio.com/storage/logs/worker.log
stopwaitsecs=3600bash
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*5. Configurar Cron
bash
sudo crontab -e -u www-data
# Adicionar:
* * * * * php /var/www/seudominio.com/artisan schedule:run >> /dev/null 2>&1Monitoramento e Logs
Laravel Telescope (Desenvolvimento/Staging)
bash
composer require laravel/telescope --dev
php artisan telescope:install
php artisan migrateAcesse: https://seudominio.com/telescope
Sentry (Produção)
bash
composer require sentry/sentry-laravel
php artisan sentry:publish --dsn=sua_dsnphp
// config/logging.php
'channels' => [
'sentry' => [
'driver' => 'sentry',
'level' => 'error',
],
],Log Viewer
bash
composer require opcodesio/log-viewer
php artisan log-viewer:publishAcesse: https://seudominio.com/log-viewer
Monitoring com Uptime Robot
- Acesse UptimeRobot
- Add New Monitor
- Monitor Type: HTTPS
- URL:
https://seudominio.com/health - Monitoring Interval: 5 minutes
- Alert Contacts: Seu email
Criar rota de health check:
php
// routes/web.php
Route::get('/health', function () {
return response()->json([
'status' => 'healthy',
'timestamp' => now()->toIso8601String(),
]);
});Backup
Laravel Backup (Spatie)
bash
composer require spatie/laravel-backup
php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider"php
// config/backup.php
'destination' => [
'disks' => ['s3'],
],
'backup' => [
'name' => env('APP_NAME', 'laravel-backup'),
'source' => [
'files' => [
'include' => [base_path()],
'exclude' => [
base_path('vendor'),
base_path('node_modules'),
],
],
'databases' => ['mysql'],
],
],Agendar backup diário:
php
// app/Console/Kernel.php
protected function schedule(Schedule $schedule): void
{
$schedule->command('backup:clean')->daily()->at('01:00');
$schedule->command('backup:run')->daily()->at('02:00');
}Rollback em Caso de Erro
Reverter Deploy
bash
# Laravel Forge: Deploy anterior
# No painel: Deployments → Rollback to Previous
# Manual
cd /var/www/seudominio.com
git reset --hard HEAD~1
composer install
php artisan migrate:rollback --step=1
php artisan config:cacheRestaurar Backup
bash
# Restaurar banco de dados
php artisan backup:list
php artisan backup:restore nome-do-backup.zipPerformance em Produção
Otimizações Recomendadas
bash
# OPcache (PHP)
# /etc/php/8.3/fpm/conf.d/10-opcache.ini
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.validate_timestamps=0
opcache.revalidate_freq=0bash
# Redis
# /etc/redis/redis.conf
maxmemory 256mb
maxmemory-policy allkeys-lruCDN para Assets
bash
# .env
ASSET_URL=https://cdn.seudominio.comConfigure CloudFlare ou AWS CloudFront para public/build/*.
Checklist Pós-Deploy
- [ ] Site está acessível via HTTPS
- [ ] SSL está válido e renovando automaticamente
- [ ] Login funciona corretamente
- [ ] Email está enviando (testar recuperação de senha)
- [ ] Queue workers estão processando jobs
- [ ] Cron está executando (verificar logs)
- [ ] Backup está funcionando
- [ ] Monitoring está ativo
- [ ] Logs estão sendo coletados
- [ ] Performance está adequada (< 500ms)
Próximos Passos
- 📖 Revise Funcionalidades Principais
- 🔧 Veja Extensões e Customizações
- 🏗️ Entenda a Estrutura do Projeto
- ⚙️ Configure Variáveis de Ambiente