Adiciona configuração inicial da stack Docker para projetos Laravel, incluindo Dockerfile, docker-compose, scripts de gerenciamento e configuração do Nginx.
This commit is contained in:
408
README.md
Normal file
408
README.md
Normal file
@@ -0,0 +1,408 @@
|
||||
# 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
|
||||
```
|
||||
Reference in New Issue
Block a user