Skip to content

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.example está 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-authoritative

2. 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-components

4. 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=1

Configuraçã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=strict

Deploy em Diferentes Plataformas

Laravel Forge (Recomendado)

1. Criar Servidor

  1. Acesse Laravel Forge
  2. Create Server → Escolha provider (DigitalOcean, AWS, etc)
  3. Selecione tamanho: Mínimo 2GB RAM
  4. Escolha região próxima aos usuários
  5. Aguarde provisionamento (5-10 min)

2. Criar Site

bash
# No Forge:
# Sites → New Site
# Domain: seudominio.com
# Project Type: General PHP/Laravel
# Web Directory: /public

3. Configurar Repositório

bash
# No Forge:
# Site → Git Repository
# Provider: GitHub
# Repository: usuario/repositorio
# Branch: main
# Deploy Key: Copiar e adicionar no GitHub

4. 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:clear

5. Configurar Workers de Fila

bash
# No Forge → Site → Queue
# Connection: redis
# Max Processes: 1
# Tries: 3
# Sleep: 3

6. Agendar Tarefas

bash
# No Forge → Site → Scheduler
# Já configurado automaticamente para:
# * * * * * php artisan schedule:run

7. SSL Gratuito

bash
# No Forge → Site → SSL
# LetsEncrypt: Ativar
# Domain: seudominio.com
# Force HTTPS: Sim

Laravel Vapor (Serverless)

1. Instalar Vapor CLI

bash
composer require laravel/vapor-cli --dev
php artisan vapor:install

2. 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:
      - default

3. Deploy

bash
# Deploy para produção
vapor deploy production

# Ver logs
vapor logs production

DigitalOcean App Platform

1. Criar App

bash
# Via dashboard:
# Create → Apps → Deploy from GitHub
# Selecione repositório

2. 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-server

2. 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 nginx

3. Instalar SSL com Certbot

bash
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d seudominio.com -d www.seudominio.com

4. 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=3600
bash
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>&1

Monitoramento e Logs

Laravel Telescope (Desenvolvimento/Staging)

bash
composer require laravel/telescope --dev
php artisan telescope:install
php artisan migrate

Acesse: https://seudominio.com/telescope

Sentry (Produção)

bash
composer require sentry/sentry-laravel
php artisan sentry:publish --dsn=sua_dsn
php
// config/logging.php
'channels' => [
    'sentry' => [
        'driver' => 'sentry',
        'level' => 'error',
    ],
],

Log Viewer

bash
composer require opcodesio/log-viewer
php artisan log-viewer:publish

Acesse: https://seudominio.com/log-viewer

Monitoring com Uptime Robot

  1. Acesse UptimeRobot
  2. Add New Monitor
  3. Monitor Type: HTTPS
  4. URL: https://seudominio.com/health
  5. Monitoring Interval: 5 minutes
  6. 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:cache

Restaurar Backup

bash
# Restaurar banco de dados
php artisan backup:list
php artisan backup:restore nome-do-backup.zip

Performance 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=0
bash
# Redis
# /etc/redis/redis.conf
maxmemory 256mb
maxmemory-policy allkeys-lru

CDN para Assets

bash
# .env
ASSET_URL=https://cdn.seudominio.com

Configure 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

  1. 📖 Revise Funcionalidades Principais
  2. 🔧 Veja Extensões e Customizações
  3. 🏗️ Entenda a Estrutura do Projeto
  4. ⚙️ Configure Variáveis de Ambiente

Recursos Úteis

Documentação privada do ecossistema Filament Core.