409 lines
6.2 KiB
Markdown
409 lines
6.2 KiB
Markdown
# Laravel Multi-Projeto Stack
|
|
|
|
Stack Docker para hospedar vários projetos Laravel no mesmo container, acessando por rota:
|
|
|
|
```txt
|
|
https://laravel.juancjc.com.br/projeto1
|
|
https://laravel.juancjc.com.br/projeto2
|
|
https://laravel.juancjc.com.br/sistema-alunos
|
|
```
|
|
|
|
A ideia é parecida com sua stack NestJS, mas para Laravel:
|
|
|
|
- Nginx na frente.
|
|
- PHP-FPM para rodar Laravel.
|
|
- Composer dentro do container.
|
|
- Node + NPM dentro do container para projetos com Vite/Vue.
|
|
- Detecta automaticamente:
|
|
- `laravel-vue`
|
|
- `laravel-blade-vite`
|
|
- `laravel-blade`
|
|
- `laravel-node`
|
|
- Cria automaticamente a rota `/nome-da-pasta`.
|
|
|
|
---
|
|
|
|
## Estrutura do repositório
|
|
|
|
```txt
|
|
laravel-stack/
|
|
├── Dockerfile
|
|
├── docker-compose.yml
|
|
├── .gitignore
|
|
├── nginx/
|
|
│ └── nginx.conf
|
|
├── php/
|
|
│ └── php.ini
|
|
├── supervisor/
|
|
│ └── supervisord.conf
|
|
├── scripts/
|
|
│ ├── start.sh
|
|
│ ├── deploy.sh
|
|
│ ├── remove.sh
|
|
│ └── status.sh
|
|
├── host-deploy.sh
|
|
├── host-remove.sh
|
|
└── host-status.sh
|
|
```
|
|
|
|
---
|
|
|
|
## Estrutura no servidor
|
|
|
|
```txt
|
|
/srv/projects/laravel/
|
|
├── projects/
|
|
│ ├── projeto1/
|
|
│ ├── projeto2/
|
|
│ └── sistema-alunos/
|
|
├── nginx-dynamic/
|
|
├── composer-cache/
|
|
└── npm-cache/
|
|
```
|
|
|
|
Cada pasta dentro de `/srv/projects/laravel/projects` vira uma rota.
|
|
|
|
Exemplo:
|
|
|
|
```txt
|
|
/srv/projects/laravel/projects/sistema-alunos
|
|
```
|
|
|
|
vira:
|
|
|
|
```txt
|
|
https://laravel.juancjc.com.br/sistema-alunos
|
|
```
|
|
|
|
---
|
|
|
|
## Setup inicial no servidor
|
|
|
|
```bash
|
|
mkdir -p /srv/projects/laravel/projects
|
|
mkdir -p /srv/projects/laravel/nginx-dynamic
|
|
mkdir -p /srv/projects/laravel/composer-cache
|
|
mkdir -p /srv/projects/laravel/npm-cache
|
|
```
|
|
|
|
Clone esta stack:
|
|
|
|
```bash
|
|
git clone <repo-da-laravel-stack> /srv/projects/laravel/laravel-stack
|
|
cd /srv/projects/laravel/laravel-stack
|
|
chmod +x host-*.sh
|
|
```
|
|
|
|
Suba com Docker Compose:
|
|
|
|
```bash
|
|
docker compose up -d --build
|
|
```
|
|
|
|
Ou pelo Portainer:
|
|
|
|
1. Stacks
|
|
2. Add Stack
|
|
3. Repository
|
|
4. Cole a URL deste repositório
|
|
5. Deploy
|
|
|
|
---
|
|
|
|
## Adicionar um projeto Laravel
|
|
|
|
Entre na pasta de projetos:
|
|
|
|
```bash
|
|
cd /srv/projects/laravel/projects
|
|
```
|
|
|
|
Clone ou coloque o código:
|
|
|
|
```bash
|
|
git clone https://github.com/seu-usuario/meu-projeto.git meu-projeto
|
|
```
|
|
|
|
Crie ou edite o `.env`:
|
|
|
|
```bash
|
|
nano /srv/projects/laravel/projects/meu-projeto/.env
|
|
```
|
|
|
|
Depois faça o deploy:
|
|
|
|
```bash
|
|
/srv/projects/laravel/laravel-stack/host-deploy.sh meu-projeto
|
|
```
|
|
|
|
Acesse:
|
|
|
|
```txt
|
|
https://laravel.juancjc.com.br/meu-projeto
|
|
```
|
|
|
|
---
|
|
|
|
## Atualizar um projeto
|
|
|
|
```bash
|
|
cd /srv/projects/laravel/projects/meu-projeto
|
|
git pull
|
|
|
|
/srv/projects/laravel/laravel-stack/host-deploy.sh meu-projeto
|
|
```
|
|
|
|
---
|
|
|
|
## Ver status
|
|
|
|
```bash
|
|
/srv/projects/laravel/laravel-stack/host-status.sh
|
|
```
|
|
|
|
---
|
|
|
|
## Remover projeto
|
|
|
|
Remove rota Nginx e arquivos:
|
|
|
|
```bash
|
|
/srv/projects/laravel/laravel-stack/host-remove.sh meu-projeto
|
|
```
|
|
|
|
Remove só a rota, mantendo os arquivos:
|
|
|
|
```bash
|
|
/srv/projects/laravel/laravel-stack/host-remove.sh meu-projeto --keep-files
|
|
```
|
|
|
|
---
|
|
|
|
## Como ele identifica Vue ou Blade
|
|
|
|
O script olha os arquivos do projeto:
|
|
|
|
### Laravel Vue
|
|
|
|
Se existir `package.json` com:
|
|
|
|
```json
|
|
"vue"
|
|
```
|
|
|
|
ou:
|
|
|
|
```json
|
|
"@inertiajs/vue3"
|
|
```
|
|
|
|
ou:
|
|
|
|
```json
|
|
"@vitejs/plugin-vue"
|
|
```
|
|
|
|
ele marca como:
|
|
|
|
```txt
|
|
laravel-vue
|
|
```
|
|
|
|
### Laravel Blade com Vite
|
|
|
|
Se existir `package.json` com Vite, mas sem Vue:
|
|
|
|
```txt
|
|
laravel-blade-vite
|
|
```
|
|
|
|
### Laravel Blade simples
|
|
|
|
Se não tiver `package.json`:
|
|
|
|
```txt
|
|
laravel-blade
|
|
```
|
|
|
|
O tipo fica salvo em:
|
|
|
|
```txt
|
|
.projeto/.project-type
|
|
```
|
|
|
|
---
|
|
|
|
## Importante para rodar em `/projeto`
|
|
|
|
Como cada sistema roda em subpasta, o deploy ajusta automaticamente no `.env` do projeto:
|
|
|
|
```env
|
|
APP_URL=https://laravel.juancjc.com.br/meu-projeto
|
|
ASSET_URL=/meu-projeto
|
|
```
|
|
|
|
Isso ajuda CSS, JS, imagens e links gerados pelo Laravel.
|
|
|
|
---
|
|
|
|
## Projetos Vue/Inertia com Vite
|
|
|
|
Se algum projeto Vue tiver problema com assets em `/build`, ajuste o `vite.config.js` para respeitar `VITE_BASE`.
|
|
|
|
Exemplo:
|
|
|
|
```js
|
|
import { defineConfig } from 'vite';
|
|
import laravel from 'laravel-vite-plugin';
|
|
import vue from '@vitejs/plugin-vue';
|
|
|
|
export default defineConfig({
|
|
base: process.env.VITE_BASE || '/',
|
|
plugins: [
|
|
laravel({
|
|
input: 'resources/js/app.js',
|
|
refresh: true,
|
|
}),
|
|
vue(),
|
|
],
|
|
});
|
|
```
|
|
|
|
O deploy já executa:
|
|
|
|
```bash
|
|
ASSET_URL="/meu-projeto" VITE_BASE="/meu-projeto/build/" npm run build
|
|
```
|
|
|
|
---
|
|
|
|
## Rodar migrations automaticamente
|
|
|
|
Por padrão, a stack não roda migrations para evitar acidente em produção.
|
|
|
|
Se quiser que rode no deploy, coloque no `.env` do projeto:
|
|
|
|
```env
|
|
RUN_MIGRATIONS=true
|
|
```
|
|
|
|
Aí no deploy ele executa:
|
|
|
|
```bash
|
|
php artisan migrate --force
|
|
```
|
|
|
|
---
|
|
|
|
## Comandos úteis
|
|
|
|
Logs do container:
|
|
|
|
```bash
|
|
docker logs laravel-stack -f
|
|
```
|
|
|
|
Entrar no container:
|
|
|
|
```bash
|
|
docker exec -it laravel-stack bash
|
|
```
|
|
|
|
Deploy manual dentro do container:
|
|
|
|
```bash
|
|
docker exec laravel-stack /home/deploy/scripts/deploy.sh meu-projeto
|
|
```
|
|
|
|
Ver Nginx:
|
|
|
|
```bash
|
|
docker exec laravel-stack nginx -T
|
|
```
|
|
|
|
Testar Nginx:
|
|
|
|
```bash
|
|
docker exec laravel-stack nginx -t
|
|
```
|
|
|
|
---
|
|
|
|
## Variáveis principais no docker-compose
|
|
|
|
```env
|
|
PROJECTS_DIR=/home/deploy/projects
|
|
DOMAIN=laravel.juancjc.com.br
|
|
PUBLIC_BASE_URL=https://laravel.juancjc.com.br
|
|
AUTO_DEPLOY_ON_START=false
|
|
PHP_MEMORY_LIMIT=512M
|
|
```
|
|
|
|
### `AUTO_DEPLOY_ON_START`
|
|
|
|
Se deixar:
|
|
|
|
```env
|
|
AUTO_DEPLOY_ON_START=false
|
|
```
|
|
|
|
o container apenas recria as rotas Nginx ao iniciar.
|
|
|
|
Se trocar para:
|
|
|
|
```env
|
|
AUTO_DEPLOY_ON_START=true
|
|
```
|
|
|
|
o container roda deploy em todos os projetos sempre que iniciar.
|
|
|
|
Eu recomendo deixar `false` e usar:
|
|
|
|
```bash
|
|
./host-deploy.sh projeto
|
|
```
|
|
|
|
quando quiser atualizar.
|
|
|
|
---
|
|
|
|
## Banco Postgres
|
|
|
|
A stack já está ligada na rede externa:
|
|
|
|
```yaml
|
|
postgres-18_default:
|
|
external: true
|
|
```
|
|
|
|
Então, no `.env` do Laravel, use o nome do serviço/container do Postgres como host.
|
|
|
|
Exemplo:
|
|
|
|
```env
|
|
DB_CONNECTION=pgsql
|
|
DB_HOST=postgres
|
|
DB_PORT=5432
|
|
DB_DATABASE=meu_banco
|
|
DB_USERNAME=meu_usuario
|
|
DB_PASSWORD=minha_senha
|
|
```
|
|
|
|
Se seu container Postgres tiver outro nome, ajuste o `DB_HOST`.
|
|
|
|
---
|
|
|
|
## Observação
|
|
|
|
Para produção, prefira colocar o domínio principal no Nginx Proxy Manager apontando para:
|
|
|
|
```txt
|
|
laravel-stack:80
|
|
```
|
|
|
|
ou para a porta publicada:
|
|
|
|
```txt
|
|
IP_DO_SERVIDOR:3452
|
|
```
|