Deploy de Aplicação Laravel
Guia completo para subir apps Laravel em produção no servidor Hostinger KVM 4, usando CloudPanel como painel de controle e GitHub como fonte do código.
Pré-requisitos do Servidor
Configurados uma única vez no servidor. Verifique antes de iniciar qualquer deploy.
| Componente | Como verificar | Obrigatório |
|---|---|---|
| CloudPanel | Acesse https://IP:8443 | Sim |
| Swap | free -h — linha Swap > 0 | Sim |
| Redis | redis-cli ping → PONG | Sim |
| Node.js | node -v → v22 ou superior | Sim |
Se algum item não estiver pronto, consulte o Guia de Setup Inicial do Servidor antes de continuar.
01 Criar o Site no CloudPanel
Cada app Laravel recebe seu próprio site isolado, com usuário SSH e pool PHP-FPM dedicados.
Navegação
Acesse https://IP_DO_SERVIDOR:8443 → Sites → + Adicionar Site → Criar um site PHP
Campos do formulário
| Campo | Valor | Observação |
|---|---|---|
| Inscrição | Laravel 12 | Selecione a versão do projeto |
| Nome do domínio | app.seudominio.com.br | Domínio ou subdomínio final |
| Versão do PHP | PHP 8.3 | Mais estável para Laravel 12 |
| Usuário do site | cliente-nomeapp | Sem espaços — será o usuário SSH |
| Senha | Gerada automaticamente | ⚠️ Anote antes de continuar! |
Verificar diretório raiz
Em Definições, confirme que o campo Diretório raiz termina com /public:
/home/cliente-nomeapp/htdocs/app.seudominio.com.br/public
Ajuste de fuso horário do PHP
Em Definições → Configurações do PHP → Diretivas adicionais:
date.timezone=America/Sao_Paulo;
display_errors=off;
02 Configurar DNS
Configure o DNS antes de emitir o SSL. Sem o domínio apontando para o servidor, o Let's Encrypt irá falhar.
Registro necessário
| Tipo | Host / Nome | Aponta para | TTL |
|---|---|---|---|
| A | subdominio ou @ para raiz |
IP_DO_SERVIDOR |
3600 |
Verificar propagação
# Deve retornar o IP do servidor
dig app.seudominio.com.br +short
A propagação pode levar de 5 minutos a 24 horas. Na Hostinger costuma ser 5–15 min.
03 Configurar SSH & GitHub
Para clonar repositórios privados, o servidor precisa de uma chave SSH autenticada no GitHub. Execute como root.
Conectar ao servidor
ssh root@IP_DO_SERVIDOR
Gerar chave SSH de deploy
# Gera a chave — pressione Enter em tudo (sem senha)
ssh-keygen -t ed25519 -C "deploy@nomeapp" -f ~/.ssh/nomeapp_deploy
# Exibe a chave pública — copie o resultado completo
cat ~/.ssh/nomeapp_deploy.pub
Configurar ~/.ssh/config
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/nomeapp_deploy
Adicionar Deploy Key no GitHub
- Acesse
github.com/USUARIO/REPOSITORIO/settings/keys - Clique em Add deploy key
- Cole o conteúdo da chave pública gerada acima
- Clique em Add key — sem marcar write access
Testar autenticação
ssh -T git@github.com
# Esperado: Hi USUARIO! You've successfully authenticated...
Chave existente de outro projeto pode ser reutilizada — basta adicioná-la como deploy key no novo repositório.
04 Clonar o Repositório
Com o SSH configurado, navegue até a pasta do site e clone o projeto.
Navegar até a pasta do site
cd /home/cliente-nomeapp/htdocs/app.seudominio.com.br/
Clonar direto na pasta atual
# O ponto no final é obrigatório
git clone git@github.com:usuario/repositorio.git .
Se esquecer o . e o Git criar uma subpasta, corrija com:mv subpasta/{.,}* . 2>/dev/null; rm -rf subpasta
Instalar dependências PHP
composer install --optimize-autoloader --no-dev
Compilar assets front-end
npm install && npm run build
Criar public/index.php (se necessário)
Se o public/index.php estiver no .gitignore do projeto, crie-o manualmente:
<?php
use Illuminate\Foundation\Application;
use Illuminate\Http\Request;
define('LARAVEL_START', microtime(true));
if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {
require $maintenance;
}
require __DIR__.'/../vendor/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
$app->handleRequest(Request::capture());
# Impede que git pull sobrescreva o arquivo
echo "public/index.php" >> .git/info/exclude
# Corrigir proprietário do arquivo
chown cliente-nomeapp:cliente-nomeapp public/index.php
05 Configurar o .env
O .env contém todas as variáveis de ambiente. Nunca o commite no Git.
Criar e gerar chave
cp .env.example .env
php artisan key:generate
Variáveis essenciais de produção
# ── Aplicação ──────────────────────────────────
APP_NAME=NomeDoApp
APP_ENV=production
APP_DEBUG=false
APP_URL=https://app.seudominio.com.br
# ── Banco de dados ──────────────────────────────
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nomeapp_db
DB_USERNAME=nomeapp_usr
DB_PASSWORD=SENHA_SEGURA
# ── Redis (cache, filas e sessões) ──────────────
CACHE_STORE=redis
QUEUE_CONNECTION=redis
SESSION_DRIVER=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
REDIS_DB=1 # Use 0,1,2... diferente por projeto
Use um REDIS_DB diferente para cada projeto (0–15) para evitar conflito de cache entre aplicações.
06 Banco de Dados
Cada projeto recebe um database e usuário MySQL próprios, criados pelo CloudPanel.
Criar no CloudPanel
Sites → app.seudominio.com.br → Bancos de dados → + Adicionar banco de dados
| Campo | Valor sugerido |
|---|---|
| Nome do banco | nomeapp_db |
| Usuário | nomeapp_usr |
| Senha | Gere uma senha forte e anote |
Rodar migrations
php artisan migrate --force
# Opcional — popular com dados iniciais:
php artisan db:seed --force
07 Certificado SSL
Emita um certificado Let's Encrypt gratuito. Renovação automática a cada 90 dias.
Emitir no CloudPanel
Sites → app.seudominio.com.br → SSL/TLS → Ações → Novo certificado Let's Encrypt
Informe seu e-mail e salve.
O Let's Encrypt falha se o DNS ainda não propagou. Se der erro, aguarde alguns minutos e tente novamente.
Após instalado, o CloudPanel renova o certificado automaticamente — nenhuma ação adicional necessária.
08 Otimizar para Produção
Comandos finais que corrigem permissões e aceleram a aplicação com cache.
# Permissões das pastas
chmod -R 775 storage bootstrap/cache
chown -R cliente-nomeapp:cliente-nomeapp storage bootstrap/cache
# Link simbólico do storage público
php artisan storage:link
# Cache para acelerar a aplicação
php artisan config:cache
php artisan route:cache
php artisan view:cache
Atualizações via git pull
Para atualizar o código em produção após novos commits, execute na ordem abaixo.
cd /home/cliente-nomeapp/htdocs/app.seudominio.com.br/
# 1. Buscar novo código
git pull
# 2. Atualizar dependências
composer install --optimize-autoloader --no-dev
npm install && npm run build
# 3. Migrations e cache
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cache
Checklist Final
Marque cada item antes de considerar o deploy concluído.
- Site criado no CloudPanel com diretório raiz apontando para
/public - DNS configurado e propagado —
dig dominio.com.br +shortretorna o IP correto - Chave SSH gerada e adicionada como deploy key no GitHub
- Repositório clonado corretamente na pasta do site
-
composer installenpm run buildexecutados sem erros -
.envconfigurado comAPP_ENV=productioneAPP_DEBUG=false - Banco de dados criado e migrations rodadas com sucesso
- SSL Let's Encrypt instalado — cadeado verde no navegador
-
config:cache,route:cacheeview:cacheexecutados - Aplicação testada no navegador em desktop e mobile