🚀 Guia Completo: Deploy Laravel na AWS
Roteiro passo a passo para clonar servidor EC2, configurar subdomínio, Cloudflare + SSL, Laravel com Nginx e PostgreSQL. Tudo otimizado para Amazon Linux 2023.
Clonar Servidor EC2 (Opcional)
Como duplicar corretamente uma instância EC2 existente
Opção A: AMI (Recomendado)
Passos no Console AWS:
- Acesse EC2 → Instances
- Selecione a instância → Actions → Image and templates → Create image
- Defina um nome para a AMI
- Aguarde a criação (pode levar alguns minutos)
- Vá em AMIs → Selecione sua imagem → Launch instance from AMI
Opção B: Snapshot do EBS
Use esta opção quando precisar apenas do disco, sem as configurações da instância.
Acessar Nova Instância e Preparar
Configurações iniciais do servidor
Ajustar Timezone para Brasil
sudo timedatectl set-timezone America/Sao_Paulo
timedatectl
O comando timedatectl sem parâmetros mostra a configuração atual para confirmar.
Instalar Pacotes Essenciais
Resolver conflitos e instalar ferramentas básicas
Resolver Conflito do Curl
sudo dnf remove -y curl-minimal
sudo dnf install -y curl
curl --version
sudo dnf install -y curl --allowerasing
Instalar Utilitários do Sistema
sudo dnf update -y
sudo dnf install -y git unzip htop
git --version
Preparar Diretório do Site
Criar estrutura de pastas e página placeholder
Criar Pasta do Domínio
sudo mkdir -p /var/www/pastabase
sudo chown -R nginx:nginx /var/www/pastabase
sudo chmod -R 755 /var/www/pastabase
Criar Página HTML Inicial
sudo tee /var/www/pastabase/index.html >/dev/null <<'HTML'
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<title>Site em Construção</title>
<style>
body {
font-family: Arial, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
margin: 0;
}
.container {
text-align: center;
background: white;
padding: 3rem;
border-radius: 1rem;
box-shadow: 0 20px 40px rgba(0,0,0,0.1);
}
h1 { color: #667eea; }
</style>
</head>
<body>
<div class="container">
<h1>🚀 Site em Construção</h1>
<p>Laravel será instalado em breve!</p>
</div>
</body>
</html>
HTML
sudo chown nginx:nginx /var/www/pastabase/index.html
Configurar VHost do Nginx
Criar configuração para o subdomínio
Criar Arquivo de Configuração
DOMINIO pelo seu domínio real (ex: app.exemplo.com.br)
sudo tee /etc/nginx/conf.d/DOMINIO.conf >/dev/null <<'NGINX'
server {
listen 80;
server_name DOMINIO;
root /var/www/pastabase;
index index.html;
access_log /var/log/nginx/DOMINIO.access.log;
error_log /var/log/nginx/DOMINIO.error.log;
location / {
try_files $uri $uri/ =404;
}
}
NGINX
Validar e Recarregar Nginx
sudo nginx -t
sudo systemctl reload nginx
sudo systemctl status nginx --no-pager
Teste Local (Sem DNS)
curl -I -H "Host: DOMINIO" http://127.0.0.1
Você deve receber um HTTP/1.1 200 OK se tudo estiver funcionando.
Configurar DNS no Cloudflare
Apontar o subdomínio para o servidor
Descobrir IP Público da EC2
curl -s https://checkip.amazonaws.com
Criar Registro DNS
No painel do Cloudflare:
- Acesse a seção DNS
- Clique em Add Record
- Configure:
- Type: A
- Name: seu subdomínio (ex: app)
- IPv4 address: IP da EC2
- Proxy status: DNS only (nuvem cinza)
Ajustar Security Group
Liberar portas HTTP e HTTPS
No Console AWS:
- Vá em EC2 → Security Groups
- Selecione o SG da sua instância
- Clique em Edit inbound rules
- Adicione:
- HTTP (80): Source 0.0.0.0/0
- HTTPS (443): Source 0.0.0.0/0
- SSH (22): Source seu IP apenas
Instalar Certificado SSL
Configurar HTTPS com Let's Encrypt
Instalar Certbot
sudo dnf install -y certbot python3-certbot-nginx
certbot --version
Gerar Certificado
sudo certbot --nginx -d DOMINIO
Durante a execução:
- Digite seu email
- Aceite os termos
- Escolha redirecionar HTTP para HTTPS (opção 2)
Validar Renovação Automática
sudo certbot renew --dry-run
Configurar Laravel
Clonar projeto, instalar dependências e configurar banco
8.1 - Clonar Projeto do GitHub
# Criar pasta do projeto
sudo mkdir -p /var/www/app
sudo chown -R ec2-user:ec2-user /var/www/app
# Clonar repositório
cd /var/www
git clone REPO_URL app
cd /var/www/app
git status
git clone [email protected]:USER/REPO.git app
8.2 - Instalar PHP e Extensões
sudo dnf install -y \
php \
php-fpm \
php-cli \
php-mbstring \
php-xml \
php-pdo \
php-pgsql \
php-bcmath \
php-json \
php-opcache \
php-zip
php -v
sudo systemctl enable --now php-fpm
sudo systemctl status php-fpm --no-pager
8.3 - Instalar Composer
cd ~
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
sudo mv composer.phar /usr/local/bin/composer
composer --version
8.4 - Instalar Dependências Laravel
cd /var/www/app
composer install --no-dev --optimize-autoloader
8.5 - Build Frontend (Se usar Vite/Mix)
# Instalar Node.js se necessário
sudo dnf install -y nodejs npm
cd /var/www/app
npm install
npm run build
8.6 - Configurar Permissões
sudo chown -R nginx:nginx /var/www/app
sudo find /var/www/app -type f -exec chmod 644 {} \;
sudo find /var/www/app -type d -exec chmod 755 {} \;
# Permissões especiais para storage e cache
sudo chmod -R 775 /var/www/app/storage
sudo chmod -R 775 /var/www/app/bootstrap/cache
8.7 - Configurar PostgreSQL
# Acessar PostgreSQL como superusuário
sudo -u postgres psql
-- Criar usuário e banco
CREATE ROLE app WITH LOGIN PASSWORD 'SenhaForte!2026@' CREATEDB;
CREATE DATABASE appdb OWNER app;
\q
# Testar conexão
psql -h 127.0.0.1 -U app -d appdb -c "SELECT NOW();"
8.8 - Configurar .env Laravel
cd /var/www/app
# Copiar arquivo exemplo e gerar chave
cp .env.example .env
php artisan key:generate
# Configurar banco de dados
sudo sed -i "s|^APP_URL=.*|APP_URL=https://DOMINIO|g" .env
sudo sed -i "s|^DB_CONNECTION=.*|DB_CONNECTION=pgsql|g" .env
sudo sed -i "s|^DB_HOST=.*|DB_HOST=127.0.0.1|g" .env
sudo sed -i "s|^DB_PORT=.*|DB_PORT=5432|g" .env
sudo sed -i "s|^DB_DATABASE=.*|DB_DATABASE=appdb|g" .env
sudo sed -i "s|^DB_USERNAME=.*|DB_USERNAME=app|g" .env
sudo sed -i "s|^DB_PASSWORD=.*|DB_PASSWORD=SenhaForte!2026@|g" .env
8.9 - Rodar Migrations e Otimizações
cd /var/www/app
# Criar tabelas
php artisan migrate --force
# Otimizar para produção
php artisan config:cache
php artisan route:cache
php artisan view:cache
Trocar Root do Nginx para Laravel
Apontar domínio para pasta public do Laravel
Atualizar VHost para Laravel
sudo tee /etc/nginx/conf.d/DOMINIO.conf >/dev/null <<'NGINX'
server {
listen 80;
server_name DOMINIO;
root /var/www/app/public;
index index.php index.html;
access_log /var/log/nginx/DOMINIO.access.log;
error_log /var/log/nginx/DOMINIO.error.log;
# Laravel routing
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# PHP processing
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# Cache static files
location ~* \.(jpg|jpeg|png|gif|svg|ico|css|js|woff2?)$ {
expires 7d;
access_log off;
add_header Cache-Control "public";
}
# Security
location ~ /\.(?!well-known).* {
deny all;
}
}
NGINX
Aplicar Configuração
sudo nginx -t
sudo systemctl reload nginx
Reinstalar Certificado SSL
sudo certbot --nginx -d DOMINIO
Finalização e Cloudflare
Últimos ajustes e ativação do proxy
Teste o acesso:
- Acesse
https://DOMINIO - Verifique se o Laravel está rodando
- Teste algumas rotas da aplicação
Ativar Proxy Cloudflare
No painel do Cloudflare:
- Vá em DNS
- Edite o registro A do seu domínio
- Mude o Proxy para ON (nuvem laranja)
Configurar SSL no Cloudflare
No painel do Cloudflare:
- Vá em SSL/TLS
- Selecione Full (strict)