# 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 /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 ```