Laravel 12 PHP 8.3

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.

🖥️ Hostinger KVM 4
☁️ CloudPanel CE
🐘 PHP 8.3
🔴 Redis
🟢 Node 22

Pré-requisitos do Servidor

Configurados uma única vez no servidor. Verifique antes de iniciar qualquer deploy.

ComponenteComo verificarObrigatório
CloudPanelAcesse https://IP:8443Sim
Swapfree -h — linha Swap > 0Sim
Redisredis-cli pingPONGSim
Node.jsnode -v → v22 ou superiorSim
⚠️

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:8443Sites+ Adicionar SiteCriar um site PHP

Campos do formulário

CampoValorObservação
InscriçãoLaravel 12Selecione a versão do projeto
Nome do domínioapp.seudominio.com.brDomínio ou subdomínio final
Versão do PHPPHP 8.3Mais estável para Laravel 12
Usuário do sitecliente-nomeappSem espaços — será o usuário SSH
SenhaGerada automaticamente⚠️ Anote antes de continuar!

Verificar diretório raiz

Em Definições, confirme que o campo Diretório raiz termina com /public:

CloudPanel → Definições
/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:

php.ini extras
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

TipoHost / NomeAponta paraTTL
A subdominio ou @ para raiz IP_DO_SERVIDOR 3600

Verificar propagação

bash
# 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

terminal local
ssh root@IP_DO_SERVIDOR

Gerar chave SSH de deploy

bash — como root
# 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

~/.ssh/config
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/nomeapp_deploy

Adicionar Deploy Key no GitHub

  1. Acesse github.com/USUARIO/REPOSITORIO/settings/keys
  2. Clique em Add deploy key
  3. Cole o conteúdo da chave pública gerada acima
  4. Clique em Add key — sem marcar write access

Testar autenticação

bash
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

bash
cd /home/cliente-nomeapp/htdocs/app.seudominio.com.br/

Clonar direto na pasta atual

bash
# 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

bash
composer install --optimize-autoloader --no-dev

Compilar assets front-end

bash
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:

public/index.php
<?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());
bash — proteger de git pull
# 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

bash
cp .env.example .env
php artisan key:generate

Variáveis essenciais de produção

.env
# ── 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

CampoValor sugerido
Nome do banconomeapp_db
Usuárionomeapp_usr
SenhaGere uma senha forte e anote

Rodar migrations

bash
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.

bash — como root
# 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.

bash — script de atualização
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.

Progresso 0 / 10 concluídos
  • Site criado no CloudPanel com diretório raiz apontando para /public
  • DNS configurado e propagado — dig dominio.com.br +short retorna o IP correto
  • Chave SSH gerada e adicionada como deploy key no GitHub
  • Repositório clonado corretamente na pasta do site
  • composer install e npm run build executados sem erros
  • .env configurado com APP_ENV=production e APP_DEBUG=false
  • Banco de dados criado e migrations rodadas com sucesso
  • SSL Let's Encrypt instalado — cadeado verde no navegador
  • config:cache, route:cache e view:cache executados
  • Aplicação testada no navegador em desktop e mobile